drip package

Submodules

drip.admin module

class drip.admin.DripAdmin(model, admin_site)

Bases: django.contrib.admin.options.ModelAdmin

add_view(request, extra_context=None)
av(view)
build_extra_context(extra_context)
change_view(request, object_id, extra_context=None)
form

alias of DripForm

get_mime_html(drip, user)
get_mime_html_from_alternatives(alternatives)
get_urls()
inlines = [<class 'drip.admin.QuerySetRuleInline'>]
list_display = ('name', 'enabled', 'message_class')
property media
timeline(request, drip_id, into_past, into_future)

Return a list of people who should get emails.

users_fields = []
view_drip_email(request, drip_id, into_past, into_future, user_id)
class drip.admin.DripForm(data=None, files=None, auto_id='id_%s', prefix=None, initial=None, error_class=<class 'django.forms.utils.ErrorList'>, label_suffix=None, empty_permitted=False, instance=None, use_required_attribute=None, renderer=None)

Bases: django.forms.models.ModelForm

property media

Return all media required to render the widgets on this form.

class drip.admin.QuerySetRuleInline(parent_model, admin_site)

Bases: django.contrib.admin.options.TabularInline

property media
model

alias of drip.models.QuerySetRule

class drip.admin.SentDripAdmin(model, admin_site)

Bases: django.contrib.admin.options.ModelAdmin

list_display = ['id', 'date', 'drip', 'user', 'subject', 'body', 'from_email', 'from_email_name']
property media
ordering = ['-id']

drip.drips module

class drip.drips.DripBase(drip_model, *args, **kwargs)

Bases: object

A base object for defining a Drip.

You can extend this manually, or you can create full querysets and templates from the admin.

__init__(drip_model, *args, **kwargs)

Initialize self. See help(type(self)) for accurate signature.

apply_queryset_rules(qs)

First collect all filter/exclude kwargs and apply any annotations. Then apply all filters at once, and all excludes at once.

body_template = None
from_email = None
from_email_name = None
get_count_from_queryset(MessageClass)
get_queryset()
name = None

needs a unique name

now()

This allows us to override what we consider “now”, making it easy to build timelines of who gets what when.

prune()

Do an exclude for all Users who have a SentDrip already.

queryset()

Returns a queryset of auth.User who meet the criteria of the drip.

Alternatively, you could create Drips on the fly using a queryset builder from the admin interface…

run()

Get the queryset, prune sent people, and send it.

send()

Send the message to each user on the queryset.

Create SentDrip for each user that gets a message.

Returns count of created SentDrips.

subject_template = None
timedelta(*a, **kw)

If needed, this allows us the ability to manipulate the slicing of time.

walk(into_past=0, into_future=0)

Walk over a date range and create new instances of self with new ranges.

class drip.drips.DripMessage(drip_base, user)

Bases: object

__init__(drip_base, user)

Initialize self. See help(type(self)) for accurate signature.

property body
property context
property from_email
property from_email_name
get_from_()
property message
property plain
property subject
drip.drips.configured_message_classes()
drip.drips.message_class_for(name)

drip.helpers module

drip.helpers.STRFDATETIME_REPL(x)
drip.helpers.get_flexible_regex(string)
drip.helpers.parse(string)

Parse a string into a timedelta object.

drip.helpers.process_regex(d)
drip.helpers.process_string(string)

drip.models module

class drip.models.Drip(id, date, lastchanged, name, enabled, from_email, from_email_name, subject_template, body_html_template, message_class)

Bases: django.db.models.base.Model

Parameters
  • id (AutoField) – Id

  • date (DateTimeField) – Date

  • lastchanged (DateTimeField) – Lastchanged

  • name (CharField) – Drip name. A unique name for this drip.

  • enabled (BooleanField) – Enabled

  • from_email (EmailField) – From email. Set a custom from email.

  • from_email_name (CharField) – From email name. Set a name for a custom from email.

  • subject_template (TextField) – Subject template

  • body_html_template (TextField) – Body html template. You will have settings and user in the context.

  • message_class (CharField) – Message class

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

body_html_template

Model field: body html template

date

Model field: date

property drip
enabled

Model field: enabled

from_email

Model field: from email

from_email_name

Model field: from email name

get_next_by_date(*, field=<django.db.models.fields.DateTimeField: date>, is_next=True, **kwargs)

Autogenerated: Finds next instance based on date.

get_next_by_lastchanged(*, field=<django.db.models.fields.DateTimeField: lastchanged>, is_next=True, **kwargs)

Autogenerated: Finds next instance based on lastchanged.

get_previous_by_date(*, field=<django.db.models.fields.DateTimeField: date>, is_next=False, **kwargs)

Autogenerated: Finds previous instance based on date.

get_previous_by_lastchanged(*, field=<django.db.models.fields.DateTimeField: lastchanged>, is_next=False, **kwargs)

Autogenerated: Finds previous instance based on lastchanged.

id

Model field: ID

lastchanged

Model field: lastchanged

message_class

Model field: message class

name

Model field: Drip Name

objects = <django.db.models.manager.Manager object>
queryset_rules

Model field: drip, accesses the M2M QuerySetRule model.

sent_drips

Model field: drip, accesses the M2M SentDrip model.

subject_template

Model field: subject template

class drip.models.QuerySetRule(id, date, lastchanged, drip, method_type, field_name, lookup_type, field_value)

Bases: django.db.models.base.Model

Parameters
  • id (AutoField) – Id

  • date (DateTimeField) – Date

  • lastchanged (DateTimeField) – Lastchanged

  • drip (ForeignKey to Drip) – Drip

  • method_type (CharField) – Method type

  • field_name (CharField) – Field name of user

  • lookup_type (CharField) – Lookup type

  • field_value (CharField) – Field value. Can be anything from a number, to a string. Or, do now-7 days or today+3 days for fancy timedelta.

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

property annotated_field_name
apply(qs, now=<built-in method now of type object>)
apply_any_annotation(qs)
clean()

Hook for doing any extra model-wide validation after clean() has been called on every field by self.clean_fields. Any ValidationError raised by this method will not be associated with a particular field; it will have a special-case association with the field defined by NON_FIELD_ERRORS.

date

Model field: date

drip

Model field: drip, accesses the Drip model.

drip_id

Model field: drip

field_name

Model field: Field name of User

field_value

Model field: field value

filter_kwargs(qs, now=<built-in method now of type object>)
get_lookup_type_display(*, field=<django.db.models.fields.CharField: lookup_type>)

Autogenerated: Shows the label of the lookup_type

get_method_type_display(*, field=<django.db.models.fields.CharField: method_type>)

Autogenerated: Shows the label of the method_type

get_next_by_date(*, field=<django.db.models.fields.DateTimeField: date>, is_next=True, **kwargs)

Autogenerated: Finds next instance based on date.

get_next_by_lastchanged(*, field=<django.db.models.fields.DateTimeField: lastchanged>, is_next=True, **kwargs)

Autogenerated: Finds next instance based on lastchanged.

get_previous_by_date(*, field=<django.db.models.fields.DateTimeField: date>, is_next=False, **kwargs)

Autogenerated: Finds previous instance based on date.

get_previous_by_lastchanged(*, field=<django.db.models.fields.DateTimeField: lastchanged>, is_next=False, **kwargs)

Autogenerated: Finds previous instance based on lastchanged.

id

Model field: ID

lastchanged

Model field: lastchanged

lookup_type

Model field: lookup type

method_type

Model field: method type

objects = <django.db.models.manager.Manager object>
set_booleans(field_value)
set_f_expressions(field_value)
set_time_deltas_and_dates(now, field_value)
class drip.models.SentDrip(*args, **kwargs)

Bases: django.db.models.base.Model

Keeps a record of all sent drips.

Parameters
  • id (AutoField) – Id

  • date (DateTimeField) – Date

  • drip (ForeignKey to Drip) – Drip

  • user (ForeignKey to User) – User

  • subject (TextField) – Subject

  • body (TextField) – Body

  • from_email (EmailField) – From email

  • from_email_name (CharField) – From email name

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

body

Model field: body

date

Model field: date

drip

Model field: drip, accesses the Drip model.

drip_id

Model field: drip

from_email

Model field: from email

from_email_name

Model field: from email name

get_next_by_date(*, field=<django.db.models.fields.DateTimeField: date>, is_next=True, **kwargs)

Autogenerated: Finds next instance based on date.

get_previous_by_date(*, field=<django.db.models.fields.DateTimeField: date>, is_next=False, **kwargs)

Autogenerated: Finds previous instance based on date.

id

Model field: ID

objects = <django.db.models.manager.Manager object>
subject

Model field: subject

user

Model field: user, accesses the User model.

user_id

Model field: user

drip.tests module

drip.utils module

drip.utils.check_redundant(model_stack, stack_limit)
drip.utils.get_field_name(field, RelatedObject)
drip.utils.get_fields(Model, parent_field='', model_stack=[], stack_limit=2, excludes=['permissions', 'comment', 'content_type'])

Given a Model, return a list of lists of strings with important stuff: … [‘test_user__user__customuser’, ‘customuser’, ‘User’, ‘RelatedObject’] [‘test_user__unique_id’, ‘unique_id’, ‘TestUser’, ‘CharField’] [‘test_user__confirmed’, ‘confirmed’, ‘TestUser’, ‘BooleanField’] …

drip.utils.get_full_field(parent_field, field_name)
drip.utils.get_out_fields(Model, parent_field, model_stack, excludes, fields)
drip.utils.get_rel_model(field, RelatedObject)
drip.utils.get_simple_fields(Model, **kwargs)
drip.utils.get_user_model()
drip.utils.give_model_field(full_field, Model)

Given a field_name and Model:

“test_user__unique_id”, <AchievedGoal>

Returns “test_user__unique_id”, “id”, <Model>, <ModelField>

drip.utils.is_valid_instance(field)

drip.views module

Module contents