models Package

models Package

Django modules package.

All models must provide a an admin meta class as ‘Model.Admin’.

mini_buildd.models.import_all()

Call this after your django app is configured.

base Module

Generic module for models of the django app mini_buildd.

Naming conventions

Model class and field names

All model class names and all field names must be human readable with no abbrevations (as django, per default, displays the internal names intelligently to the end user).

Model class names must be in CamelCase.

Field names must be all lowercase and seperatedy by underscores.

For example, don’t try to do sort of “grouping” using names like:

email_notify
email_allow_regex

This should rather read:

notify
allow_emails_to

To group fields together for the end user, use AdminModel’s fieldset option.

Methods

Methods that represent mini-buildd logic should go into the models directly, but must be prefixed with “mbd_”. This avoids conflicts with method names form the django model’s class, but still keeps the logic where it belongs.

class mini_buildd.models.base.Model(*args, **kwargs)

Bases: django.db.models.base.Model

Abstract father model for all mini-buildd models.

This just makes sure no config is changed or deleted while the daemon is running.

class Admin(model, admin_site)

Bases: django.contrib.admin.options.ModelAdmin

delete_model(request, obj)
mbd_model

alias of Subscription

media
save_model(request, obj, form, change)
class Model.Meta

Bases: object

abstract = False
app_label = u'mini_buildd'
classmethod Model.mbd_get_daemon()
Model.mbd_get_dependencies()
Model.mbd_get_extra_option(key, default=None)
Model.mbd_get_extra_options()
classmethod Model.mbd_get_or_create(msglog, **kwargs)

Like get_or_create, but adds a info message.

Model.mbd_get_pickled_data(default=None)
Model.mbd_get_reverse_dependencies()
Model.mbd_set_pickled_data(data)
Model.mbd_set_pickled_data_pickled(pickled_data)
classmethod Model.mbd_validate_regex(regex, value, field_name)
class mini_buildd.models.base.StatusModel(*args, **kwargs)

Bases: mini_buildd.models.base.Model

Abstract model class for all models that carry a status. See Manual: Configuration.

class Admin(model, admin_site)

Bases: mini_buildd.models.base.Admin

actions = [<function mbd_action_prepare at 0x7f4e45d12f50>, <function mbd_action_check at 0x7f4e45d22050>, <function mbd_action_pc at 0x7f4e45d22230>, <function mbd_action_activate at 0x7f4e45d220c8>, <function mbd_action_pca at 0x7f4e45d222a8>, <function mbd_action_deactivate at 0x7f4e45d22140>, <function mbd_action_remove at 0x7f4e45d221b8>]
colored_status(obj)
list_display = [u'colored_status', u'__unicode__']
classmethod mbd_action(request, queryset, action, **kwargs)

Try to run action on each object in queryset, emit error message on failure, but don’t fail ourself.

mbd_action_activate(request, queryset)
mbd_action_check(request, queryset)
mbd_action_deactivate(request, queryset)
mbd_action_pc(request, queryset)
mbd_action_pca(request, queryset)
mbd_action_prepare(request, queryset)
mbd_action_remove(request, queryset)
classmethod mbd_activate(request, obj)
classmethod mbd_check(request, obj, force=False, needs_activation=False)
classmethod mbd_deactivate(request, obj)
classmethod mbd_meta_pca_all(msglog)

Run prepare, check, and activate for all objects of this model

classmethod mbd_prepare(request, obj)
classmethod mbd_remove(request, obj)
media
save_model(request, obj, form, change)
StatusModel.CHECK_CHANGED = datetime.datetime(1, 1, 2, 0, 0)
StatusModel.CHECK_FAILED = datetime.datetime(1, 1, 3, 0, 0)
StatusModel.CHECK_NONE = datetime.datetime(1, 1, 1, 0, 0)
StatusModel.CHECK_REACTIVATE = datetime.datetime(1, 1, 4, 0, 0)
StatusModel.CHECK_STRINGS = {datetime.datetime(1, 1, 4, 0, 0): {u'char': u'A', u'string': u'Failed in active state -- will auto-activate when check succeeds again'}, datetime.datetime(1, 1, 1, 0, 0): {u'char': u'-', u'string': u'Unchecked -- please run check'}, datetime.datetime(1, 1, 2, 0, 0): {u'char': u'*', u'string': u'Changed -- please prepare again'}, datetime.datetime(1, 1, 3, 0, 0): {u'char': u'x', u'string': u'Failed -- please fix and check again'}}
StatusModel.LETHAL_DEPENDENCIES = True
class StatusModel.Meta

Bases: mini_buildd.models.base.Meta

abstract = False
StatusModel.STATUS_ACTIVE = 2
StatusModel.STATUS_CHOICES = ((0, u'Removed'), (1, u'Prepared'), (2, u'Active'))
StatusModel.STATUS_COLORS = {0: {u'bg': u'red', u'fg': u'black'}, 1: {u'bg': u'yellow', u'fg': u'black'}, 2: {u'bg': u'green', u'fg': u'white'}}
StatusModel.STATUS_PREPARED = 1
StatusModel.STATUS_REMOVED = 0
StatusModel.days_until_recheck

Field temporarily implemented as extra_option.

Note

Currently using 6 days as default value – as it copes better with the current setup to restart mini-buildd weekly (via cron.weekly) to actually achieve automated checking.

StatusModel.get_next_by_last_checked(*moreargs, **morekwargs)
StatusModel.get_previous_by_last_checked(*moreargs, **morekwargs)
StatusModel.get_status_display(*moreargs, **morekwargs)
classmethod StatusModel.mbd_get_active()
classmethod StatusModel.mbd_get_active_or_auto_reactivate()
StatusModel.mbd_get_check_display(typ=u'string')
classmethod StatusModel.mbd_get_prepared()
StatusModel.mbd_get_status_display(typ=u'string')
StatusModel.mbd_is_active()
StatusModel.mbd_is_changed()
StatusModel.mbd_is_checked()
StatusModel.mbd_is_prepared()
StatusModel.mbd_needs_check()
StatusModel.mbd_set_changed(request)

chroot Module

class mini_buildd.models.chroot.Chroot(*args, **kwargs)

Bases: mini_buildd.models.base.StatusModel

Chroot(id, extra_options, pickled_data, status, last_checked, auto_reactivate, source_id, architecture_id, personality, personality_override)

class Admin(model, admin_site)

Bases: mini_buildd.models.base.Admin

fieldsets = [(u'Chroot identity', {u'fields': ((u'source', u'architecture'), u'personality', u'personality_override')}), (u'Extra options', {u'fields': (u'extra_options',), u'classes': (u'collapse',), u'description': u'\n<b>Supported extra options</b>\n<p><tt>Debootstrap-Command: ALT_COMMAND</tt>: Alternate command to run instead of standard debootstrap.</p>\n<p>\nFor example, <tt>Debootstrap-Command: /usr/sbin/qemu-debootstrap</tt> may be used to produce <em>armel</em>\nchroots (with <tt>qemu-user-static</tt> installed).\n</p>\n'})]
get_readonly_fields(_request, obj=None)

Forbid change source/arch on existing chroot (we would loose the path to the associated data).

classmethod mbd_host_architecture()
mbd_model

alias of Chroot

media
readonly_fields = [u'personality']
search_fields = [u'source__codename', u'architecture__name']
exception Chroot.DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception Chroot.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

Chroot.PERSONALITIES = {u'i386': u'linux32'}
Chroot.architecture
Chroot.dirchroot
Chroot.filechroot
Chroot.get_next_by_last_checked(*moreargs, **morekwargs)
Chroot.get_previous_by_last_checked(*moreargs, **morekwargs)
Chroot.get_status_display(*moreargs, **morekwargs)
Chroot.lvmchroot
Chroot.mbd_backend_check(request)

Subclasses may implement this to do extra backend checks.

Chroot.mbd_check(request)
Chroot.mbd_check_sudo_workaround(request)

mini-buildd <= 1.0.4 created chroots with a “sudo workaround” for bug https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=607228.

Suche chroots must be recreated, and no longer used.

Chroot.mbd_get_backend()
Chroot.mbd_get_dependencies()
Chroot.mbd_get_keyring_file()

Holds all keys from the source to verify the release via debootstrap’s –keyring option.

Chroot.mbd_get_name()
Chroot.mbd_get_path()
Chroot.mbd_get_pre_sequence()

Subclasses may implement this to do define an extra preliminary sequence.

Chroot.mbd_get_schroot_conf_file()
Chroot.mbd_get_sequence()
Chroot.mbd_get_system_schroot_conf_file()
Chroot.mbd_get_tmp_dir()
Chroot.mbd_prepare(request)
Chroot.mbd_remove(request)
Chroot.mbd_sync(request)
Chroot.objects = <django.db.models.manager.Manager object at 0x7f4e45ce8dd0>
Chroot.source
class mini_buildd.models.chroot.DirChroot(*args, **kwargs)

Bases: mini_buildd.models.chroot.Chroot

Dir chroot backend.

class Admin(model, admin_site)

Bases: mini_buildd.models.chroot.Admin

fieldsets = [(u'Chroot identity', {u'fields': ((u'source', u'architecture'), u'personality', u'personality_override')}), (u'Extra options', {u'fields': (u'extra_options',), u'classes': (u'collapse',), u'description': u'\n<b>Supported extra options</b>\n<p><tt>Debootstrap-Command: ALT_COMMAND</tt>: Alternate command to run instead of standard debootstrap.</p>\n<p>\nFor example, <tt>Debootstrap-Command: /usr/sbin/qemu-debootstrap</tt> may be used to produce <em>armel</em>\nchroots (with <tt>qemu-user-static</tt> installed).\n</p>\n'}), (u'Dir options', {u'fields': (u'union_type',)})]
classmethod mbd_meta_add_base_sources(msglog)
mbd_model

alias of DirChroot

media
exception DirChroot.DoesNotExist

Bases: mini_buildd.models.chroot.DoesNotExist

exception DirChroot.MultipleObjectsReturned

Bases: mini_buildd.models.chroot.MultipleObjectsReturned

DirChroot.UNION_AUFS = 0
DirChroot.UNION_CHOICES = ((0, u'aufs'), (1, u'overlayfs'), (2, u'unionfs'), (3, u'overlay'))
DirChroot.UNION_OVERLAY = 3
DirChroot.UNION_OVERLAYFS = 1
DirChroot.UNION_UNIONFS = 2
DirChroot.chroot_ptr
DirChroot.get_union_type_display(*moreargs, **morekwargs)
DirChroot.mbd_backend_flavor()
DirChroot.mbd_get_chroot_dir()
DirChroot.mbd_get_post_sequence()
DirChroot.mbd_get_schroot_conf()
DirChroot.objects = <django.db.models.manager.Manager object at 0x7f4e45ce9250>
class mini_buildd.models.chroot.FileChroot(*args, **kwargs)

Bases: mini_buildd.models.chroot.Chroot

File chroot backend.

class Admin(model, admin_site)

Bases: mini_buildd.models.chroot.Admin

fieldsets = [(u'Chroot identity', {u'fields': ((u'source', u'architecture'), u'personality', u'personality_override')}), (u'Extra options', {u'fields': (u'extra_options',), u'classes': (u'collapse',), u'description': u'\n<b>Supported extra options</b>\n<p><tt>Debootstrap-Command: ALT_COMMAND</tt>: Alternate command to run instead of standard debootstrap.</p>\n<p>\nFor example, <tt>Debootstrap-Command: /usr/sbin/qemu-debootstrap</tt> may be used to produce <em>armel</em>\nchroots (with <tt>qemu-user-static</tt> installed).\n</p>\n'}), (u'File options', {u'fields': (u'compression',)})]
classmethod mbd_meta_add_base_sources(msglog)
mbd_model

alias of FileChroot

media
FileChroot.COMPRESSION_BZIP2 = 2
FileChroot.COMPRESSION_CHOICES = ((0, u'no compression'), (1, u'gzip'), (2, u'bzip2'), (3, u'xz'))
FileChroot.COMPRESSION_GZIP = 1
FileChroot.COMPRESSION_NONE = 0
FileChroot.COMPRESSION_XZ = 3
exception FileChroot.DoesNotExist

Bases: mini_buildd.models.chroot.DoesNotExist

exception FileChroot.MultipleObjectsReturned

Bases: mini_buildd.models.chroot.MultipleObjectsReturned

FileChroot.TAR_ARGS = {0: [], 1: [u'--gzip'], 2: [u'--bzip2'], 3: [u'--xz']}
FileChroot.TAR_SUFFIX = {0: u'tar', 1: u'tar.gz', 2: u'tar.bz2', 3: u'tar.xz'}
FileChroot.chroot_ptr
FileChroot.get_compression_display(*moreargs, **morekwargs)
FileChroot.mbd_backend_flavor()
FileChroot.mbd_get_post_sequence()
FileChroot.mbd_get_schroot_conf()
FileChroot.mbd_get_tar_file()
FileChroot.objects = <django.db.models.manager.Manager object at 0x7f4e45ce96d0>
class mini_buildd.models.chroot.LVMChroot(*args, **kwargs)

Bases: mini_buildd.models.chroot.Chroot

LVM chroot backend.

class Admin(model, admin_site)

Bases: mini_buildd.models.chroot.Admin

fieldsets = [(u'Chroot identity', {u'fields': ((u'source', u'architecture'), u'personality', u'personality_override')}), (u'Extra options', {u'fields': (u'extra_options',), u'classes': (u'collapse',), u'description': u'\n<b>Supported extra options</b>\n<p><tt>Debootstrap-Command: ALT_COMMAND</tt>: Alternate command to run instead of standard debootstrap.</p>\n<p>\nFor example, <tt>Debootstrap-Command: /usr/sbin/qemu-debootstrap</tt> may be used to produce <em>armel</em>\nchroots (with <tt>qemu-user-static</tt> installed).\n</p>\n'}), (u'LVM options', {u'fields': (u'volume_group', u'filesystem', u'snapshot_size')})]
classmethod mbd_meta_add_base_sources(msglog)
mbd_model

alias of LVMChroot

media
exception LVMChroot.DoesNotExist

Bases: mini_buildd.models.chroot.DoesNotExist

exception LVMChroot.MultipleObjectsReturned

Bases: mini_buildd.models.chroot.MultipleObjectsReturned

LVMChroot.chroot_ptr
LVMChroot.looplvmchroot
LVMChroot.mbd_backend_check(request)
LVMChroot.mbd_backend_flavor()
LVMChroot.mbd_get_lvm_device()
LVMChroot.mbd_get_post_sequence()
LVMChroot.mbd_get_pre_sequence()
LVMChroot.mbd_get_schroot_conf()
LVMChroot.mbd_get_volume_group()
LVMChroot.objects = <django.db.models.manager.Manager object at 0x7f4e45ce9c90>
class mini_buildd.models.chroot.LoopLVMChroot(*args, **kwargs)

Bases: mini_buildd.models.chroot.LVMChroot

Loop LVM chroot backend.

class Admin(model, admin_site)

Bases: mini_buildd.models.chroot.Admin

fieldsets = [(u'Chroot identity', {u'fields': ((u'source', u'architecture'), u'personality', u'personality_override')}), (u'Extra options', {u'fields': (u'extra_options',), u'classes': (u'collapse',), u'description': u'\n<b>Supported extra options</b>\n<p><tt>Debootstrap-Command: ALT_COMMAND</tt>: Alternate command to run instead of standard debootstrap.</p>\n<p>\nFor example, <tt>Debootstrap-Command: /usr/sbin/qemu-debootstrap</tt> may be used to produce <em>armel</em>\nchroots (with <tt>qemu-user-static</tt> installed).\n</p>\n'}), (u'LVM options', {u'fields': (u'volume_group', u'filesystem', u'snapshot_size')}), (u'Loop options', {u'fields': (u'loop_size',)})]
classmethod mbd_meta_add_base_sources(msglog)
mbd_model

alias of LoopLVMChroot

media
exception LoopLVMChroot.DoesNotExist

Bases: mini_buildd.models.chroot.DoesNotExist

exception LoopLVMChroot.MultipleObjectsReturned

Bases: mini_buildd.models.chroot.MultipleObjectsReturned

LoopLVMChroot.lvmchroot_ptr
LoopLVMChroot.mbd_backend_flavor()
LoopLVMChroot.mbd_get_backing_file()
LoopLVMChroot.mbd_get_loop_device()
LoopLVMChroot.mbd_get_pre_sequence()
LoopLVMChroot.mbd_get_volume_group()
LoopLVMChroot.objects = <django.db.models.manager.Manager object at 0x7f4e45b36190>

daemon Module

class mini_buildd.models.daemon.Daemon(*args, **kwargs)

Bases: mini_buildd.models.base.StatusModel

Daemon(id, extra_options, pickled_data, status, last_checked, auto_reactivate, identity, hostname, email_address, gnupg_template, gnupg_keyserver, ftpd_bind, ftpd_options, build_queue_size, sbuild_jobs, smtp_server, allow_emails_to, custom_hooks_directory, show_last_packages, show_last_builds, wait_for_build_results, keep_build_results)

class Admin(model, admin_site)

Bases: mini_buildd.models.base.Admin

fieldsets = ((None, {u'fields': (), u'description': u'The daemon instance. There is always exactly one instance of this.\n\nprepare/remove actions will generate/remove the GnuPG key.\n'}), (u'Archive identity', {u'fields': ((u'identity', u'hostname', u'email_address'), u'gnupg_template')}), (u'FTP (incoming) Options', {u'fields': (u'ftpd_bind', u'ftpd_options')}), (u'Load Options', {u'fields': (u'build_queue_size', u'sbuild_jobs')}), (u'E-Mail Options', {u'fields': (u'smtp_server', u'notify', u'allow_emails_to')}), (u'Other Options', {u'fields': (u'gnupg_keyserver', u'custom_hooks_directory', u'show_last_packages', u'show_last_builds')}))
filter_horizontal = (u'notify',)
mbd_model

alias of Daemon

media
readonly_fields = [u'smtp_server', u'ftpd_options', u'custom_hooks_directory']
save_model(request, obj, form, change)

Always update date the daemon object to model.

exception Daemon.DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

Daemon.LETHAL_DEPENDENCIES = False
exception Daemon.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

Daemon.clean(*args, **kwargs)
Daemon.get_next_by_last_checked(*moreargs, **morekwargs)
Daemon.get_previous_by_last_checked(*moreargs, **morekwargs)
Daemon.get_status_display(*moreargs, **morekwargs)
Daemon.mbd_check(request)

Just warn in case there are no repos and no chroots.

Daemon.mbd_fullname
Daemon.mbd_get_archive_origin()
Daemon.mbd_get_dependencies()

All active or to-be active repositories, remotes and chroots.

Daemon.mbd_get_dput_conf()
Daemon.mbd_get_ftp_hopo()
Daemon.mbd_get_ftp_url()
Daemon.mbd_get_http_hopo()
Daemon.mbd_get_http_url()
Daemon.mbd_get_pub_key()
Daemon.mbd_gnupg
Daemon.mbd_gnupg_fingerprint
Daemon.mbd_gnupg_long_id
Daemon.mbd_notify(subject, body, repository=None, changes=None, distribution=None, msglog=<logging.Logger object at 0x7f4e45ac4f10>)
Daemon.mbd_prepare(request)
Daemon.mbd_remove(request)
classmethod Daemon.mbd_sync(request)
Daemon.notify
Daemon.objects = <django.db.models.manager.Manager object at 0x7f4e45ae4590>

gnupg Module

class mini_buildd.models.gnupg.AptKey(*args, **kwargs)

Bases: mini_buildd.models.gnupg.GnuPGPublicKey

AptKey(id, extra_options, pickled_data, status, last_checked, auto_reactivate, key_id, key, key_long_id, key_created, key_expires, key_name, key_fingerprint)

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception AptKey.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

AptKey.clean(*args, **kwargs)
AptKey.get_next_by_last_checked(*moreargs, **morekwargs)
AptKey.get_previous_by_last_checked(*moreargs, **morekwargs)
AptKey.get_status_display(*moreargs, **morekwargs)
AptKey.objects = <django.db.models.manager.Manager object at 0x7f4e45d24750>
AptKey.source_set
class mini_buildd.models.gnupg.GnuPGPublicKey(*args, **kwargs)

Bases: mini_buildd.models.base.StatusModel

class Admin(model, admin_site)

Bases: mini_buildd.models.base.Admin

exclude = (u'extra_options',)
mbd_model

alias of AptKey

media
readonly_fields = [u'key_long_id', u'key_created', u'key_expires', u'key_name', u'key_fingerprint']
search_fields = [u'key_id', u'key_long_id', u'key_name', u'key_fingerprint']
class GnuPGPublicKey.Meta

Bases: mini_buildd.models.base.Meta

abstract = False
app_label = u'mini_buildd'
GnuPGPublicKey.clean(*args, **kwargs)
GnuPGPublicKey.get_next_by_last_checked(*moreargs, **morekwargs)
GnuPGPublicKey.get_previous_by_last_checked(*moreargs, **morekwargs)
GnuPGPublicKey.get_status_display(*moreargs, **morekwargs)
GnuPGPublicKey.mbd_check(_request)

Checks that we actually have the key and long_id. This should always be true after “prepare”.

classmethod GnuPGPublicKey.mbd_filter_key(key_id)
GnuPGPublicKey.mbd_prepare(_request)
GnuPGPublicKey.mbd_remove(_request)
GnuPGPublicKey.mbd_sync(request)
class mini_buildd.models.gnupg.KeyringKey(*args, **kwargs)

Bases: mini_buildd.models.gnupg.GnuPGPublicKey

Abtract class for GnuPG keys that influence the daemon’s keyring.

This basically means changes to remotes and users may be done on the fly (without stopping the daemon), to make this maintenance practically usable.

class Admin(model, admin_site)

Bases: mini_buildd.models.gnupg.Admin

media
class KeyringKey.Meta

Bases: mini_buildd.models.base.Meta

abstract = False
app_label = u'mini_buildd'
KeyringKey.get_next_by_last_checked(*moreargs, **morekwargs)
KeyringKey.get_previous_by_last_checked(*moreargs, **morekwargs)
KeyringKey.get_status_display(*moreargs, **morekwargs)
class mini_buildd.models.gnupg.Remote(*args, **kwargs)

Bases: mini_buildd.models.gnupg.KeyringKey

Remote(extra_options, pickled_data, status, last_checked, auto_reactivate, key_id, key, key_long_id, key_created, key_expires, key_name, key_fingerprint, http, wake_command)

class Admin(model, admin_site)

Bases: mini_buildd.models.gnupg.Admin

mbd_model

alias of Remote

media
readonly_fields = [u'key_long_id', u'key_created', u'key_expires', u'key_name', u'key_fingerprint', u'key', u'key_id', u'pickled_data']
search_fields = [u'key_id', u'key_long_id', u'key_name', u'key_fingerprint', u'http']
exception Remote.DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception Remote.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

Remote.get_next_by_last_checked(*moreargs, **morekwargs)
Remote.get_previous_by_last_checked(*moreargs, **morekwargs)
Remote.get_status_display(*moreargs, **morekwargs)
Remote.mbd_check(request)

Check whether the remote mini-buildd is up, running and serving for us.

Remote.mbd_get_status(update=False)
Remote.mbd_prepare(request)
Remote.mbd_remove(request)
Remote.objects = <django.db.models.manager.Manager object at 0x7f4e45c3b090>
class mini_buildd.models.gnupg.Uploader(*args, **kwargs)

Bases: mini_buildd.models.gnupg.KeyringKey

Uploader(id, extra_options, pickled_data, status, last_checked, auto_reactivate, key_id, key, key_long_id, key_created, key_expires, key_name, key_fingerprint, user_id)

class Admin(model, admin_site)

Bases: mini_buildd.models.gnupg.Admin

filter_horizontal = (u'may_upload_to',)
mbd_model

alias of Uploader

media
readonly_fields = [u'key_long_id', u'key_created', u'key_expires', u'key_name', u'key_fingerprint', u'user']
search_fields = [u'key_id', u'key_long_id', u'key_name', u'key_fingerprint', u'user__username']
exception Uploader.DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception Uploader.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

Uploader.get_next_by_last_checked(*moreargs, **morekwargs)
Uploader.get_previous_by_last_checked(*moreargs, **morekwargs)
Uploader.get_status_display(*moreargs, **morekwargs)
Uploader.may_upload_to
Uploader.objects = <django.db.models.manager.Manager object at 0x7f4e45d308d0>
Uploader.user
mini_buildd.models.gnupg.cb_create_user_profile(sender, instance, created, **kwargs)

Automatically create a user profile with every user that is created

msglog Module

Message log: Logs that should also go to the end user.

An instance of MsgLog may replace the standard (python) log; logs will also go to the django messaging system, and it also stores the logs so they might used for other (non-django) uses.

Logs done via MsgLog (aka “messages”) are intended for the end user, to be shown in an UI (for us, the django web app or the command line client).

Log coding idioms to be used:

# Optional: Alias for MsgLog class in modules where we need it
from mini_buildd.models.msglog import MsgLog

# Always: Global standard LOG object, directly after imports)
LOG = logging.getLogger(__name__)

# Standard log
LOG.info("blah blah")

# Message log
MsgLog(LOG, request).info("Dear user: blah blah")
class mini_buildd.models.msglog.MsgLog(pylog, request)

Bases: object

critical(msg)
debug(msg)
error(msg)
exception(msg)
info(msg)
classmethod level2django(level)

Map standard python log levels to django’s.

log(level, msg)
log_text(text, level=20)
warn(msg)

repository Module

class mini_buildd.models.repository.ArchitectureOption(*args, **kwargs)

Bases: mini_buildd.models.base.Model

ArchitectureOption(id, extra_options, pickled_data, architecture_id, distribution_id, optional, build_architecture_all)

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception ArchitectureOption.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

ArchitectureOption.architecture
ArchitectureOption.clean(*args, **kwargs)
ArchitectureOption.distribution
ArchitectureOption.objects = <django.db.models.manager.Manager object at 0x7f4e45a5ffd0>
class mini_buildd.models.repository.ArchitectureOptionInline(parent_model, admin_site)

Bases: django.contrib.admin.options.TabularInline

exclude = (u'extra_options',)
extra = 1
media
model

alias of ArchitectureOption

class mini_buildd.models.repository.Distribution(*args, **kwargs)

Bases: mini_buildd.models.base.Model

Distribution(id, extra_options, pickled_data, base_source_id, build_dep_resolver, apt_allow_unauthenticated, lintian_mode, lintian_extra_options, piuparts_mode, piuparts_extra_options, piuparts_root_arg, chroot_setup_script, sbuildrc_snippet)

class Admin(model, admin_site)

Bases: mini_buildd.models.base.Admin

fieldsets = ((u'Basics', {u'fields': (u'base_source', u'extra_sources', u'components')}), (u'Build options', {u'fields': (u'build_dep_resolver', u'apt_allow_unauthenticated', u'lintian_mode', u'lintian_extra_options')}), (u'Chroot setup options', {u'fields': (u'chroot_setup_script', u'sbuildrc_snippet'), u'classes': (u'collapse',)}), (u'Extra Options', {u'fields': (u'extra_options',), u'classes': (u'collapse',), u'description': u"\n<b>Supported extra options</b>\n<p><em>Internal-APT-Priority: N</em>: Set APT priority for internal apt sources in builds.</p>\n<p>\nThe default is 1, which means you will only build against newer\npackages in our own repositories in case it's really needed by\nthe build dependencies. This is the recommended behaviour,\nproducing sparse dependencies.\n</p>\n<p>\nHowever, some packages with incorrect build dependencies might\nbreak anyway, while they would work fine when just build against\nthe newest version available.\n</p>\n<p>\nSo, in case you don't care about sparse dependencies, you can\npimp the internal priority up here.\n</p>\n<p>\n<em>Example</em>:\n<tt>Internal-APT-Priority: 500</tt>: Always build against newer internal packages.\n</p>\n"}))
filter_horizontal = (u'extra_sources', u'components')
inlines = (<class 'mini_buildd.models.repository.ArchitectureOptionInline'>,)
classmethod mbd_meta_add_base_sources(msglog)

Add default distribution objects for all base sources found.

mbd_model

alias of Distribution

media
exception Distribution.DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

Distribution.LINTIAN_CHOICES = ((0, u"Don't run lintian"), (1, u'Run lintian'), (2, u'Run lintian and fail on errors'), (3, u'Run lintian and fail on warnings'))
Distribution.LINTIAN_DISABLED = 0
Distribution.LINTIAN_FAIL_ON_ERROR = 2
Distribution.LINTIAN_FAIL_ON_WARNING = 3
Distribution.LINTIAN_RUN_ONLY = 1
exception Distribution.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

Distribution.PIUPARTS_CHOICES = ((0, u"Don't run piuparts"), (1, u'Run piuparts'), (2, u'Run piuparts and fail on errors'), (3, u'Run piuparts and fail on warnings'))
Distribution.PIUPARTS_DISABLED = 0
Distribution.PIUPARTS_FAIL_ON_ERROR = 2
Distribution.PIUPARTS_FAIL_ON_WARNING = 3
Distribution.PIUPARTS_RUN_ONLY = 1
Distribution.RESOLVER_APT = 0
Distribution.RESOLVER_APTITUDE = 1
Distribution.RESOLVER_CHOICES = ((0, u'apt'), (1, u'aptitude'), (2, u'internal'))
Distribution.RESOLVER_INTERNAL = 2
Distribution.architectureoption_set
Distribution.architectures
Distribution.base_source
Distribution.components
Distribution.extra_sources
Distribution.get_build_dep_resolver_display(*moreargs, **morekwargs)
Distribution.get_lintian_mode_display(*moreargs, **morekwargs)
Distribution.get_piuparts_mode_display(*moreargs, **morekwargs)
Distribution.mbd_get_apt_line(repository, suite_option, rollback=None, prefix=u'deb ')
Distribution.mbd_get_apt_preferences(repository, suite_option)
Distribution.mbd_get_apt_sources_list(repository, suite_option)
Distribution.mbd_get_archall_architectures()
Distribution.mbd_get_architectures(show_opt_flag=False)
Distribution.mbd_get_components()
Distribution.mbd_get_mandatory_architectures()
Distribution.mbd_get_reverse_dependencies()

When the distribution changes, all repos that use that distribution also change.

Distribution.mbd_get_sbuildrc_snippet(arch)
Distribution.objects = <django.db.models.manager.Manager object at 0x7f4e45cbf9d0>
Distribution.repository_set
class mini_buildd.models.repository.EmailAddress(*args, **kwargs)

Bases: mini_buildd.models.base.Model

EmailAddress(extra_options, pickled_data, address, name)

class Admin(model, admin_site)

Bases: mini_buildd.models.base.Admin

exclude = (u'extra_options',)
mbd_model

alias of EmailAddress

media
exception EmailAddress.DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception EmailAddress.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

EmailAddress.daemon_set
EmailAddress.objects = <django.db.models.manager.Manager object at 0x7f4e45c6b250>
EmailAddress.repository_set
class mini_buildd.models.repository.Layout(*args, **kwargs)

Bases: mini_buildd.models.base.Model

Layout(extra_options, pickled_data, name, default_version, mandatory_version_regex, experimental_default_version, experimental_mandatory_version_regex)

class Admin(model, admin_site)

Bases: mini_buildd.models.base.Admin

fieldsets = ((u'Basics', {u'fields': (u'name',)}), (u'Version Options', {u'fields': (u'default_version', u'mandatory_version_regex', u'experimental_default_version', u'experimental_mandatory_version_regex'), u'classes': (u'collapse',)}), (u'Extra Options', {u'fields': (u'extra_options',), u'classes': (u'collapse',), u'description': u"\n<b>Supported extra options</b>\n<p><em>Meta-Distributions: META=CODENAME-SUITE[ META=CODENAME-SUITE[...</em>: Support METAs alone as distribution identifier.</p>\n<p>\nMeta distribution identifiers should be unique across all\nrepositories; usually, a layout with meta distributions should\nonly be used by at most one repository.\n</p>\n<p>\n<em>Example</em>:\n<tt>Meta-Distributions: unstable=sid-unstable experimental=sid-experimental</tt>\n(see standard layout 'Debian Developer'), to allow upload/testing of\npackages (to unstable,experimental,..) aimed for Debian.\n</p>\n"}))
inlines = (<class 'mini_buildd.models.repository.SuiteOptionInline'>,)
classmethod mbd_meta_create_defaults(msglog)

Create default layouts and suites.

mbd_model

alias of Layout

media
exception Layout.DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception Layout.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

Layout.mbd_get_default_version(repository, distribution, suite_option)
Layout.mbd_get_mandatory_version_regex(repository, distribution, suite_option)
Layout.mbd_get_reverse_dependencies()

When the layout changes, all repos that use that layout also change.

Layout.objects = <django.db.models.manager.Manager object at 0x7f4e45a5f910>
Layout.repository_set
Layout.suiteoption_set
Layout.suites
class mini_buildd.models.repository.Repository(*args, **kwargs)

Bases: mini_buildd.models.base.StatusModel

Repository(extra_options, pickled_data, status, last_checked, auto_reactivate, identity, layout_id, allow_unauthenticated_uploads, extra_uploader_keyrings, notify_changed_by, notify_maintainer, reprepro_morguedir, external_home_url)

class Admin(model, admin_site)

Bases: mini_buildd.models.base.Admin

fieldsets = ((u'Basics', {u'fields': (u'identity', u'layout', u'distributions', u'allow_unauthenticated_uploads', u'extra_uploader_keyrings')}), (u'Notify and extra options', {u'fields': (u'notify', u'notify_changed_by', u'notify_maintainer', u'reprepro_morguedir', u'external_home_url')}))
filter_horizontal = (u'distributions', u'notify')
get_readonly_fields(_request, obj=None)

Forbid change identity on existing repository.

classmethod mbd_meta_add_debdev(msglog)

Add developer repository ‘debdev’, only for sid.

classmethod mbd_meta_add_sandbox(msglog)

Add sandbox repository ‘test’.

classmethod mbd_meta_build_keyring_packages(msglog)
classmethod mbd_meta_build_test_packages(msglog)
mbd_model

alias of Repository

media
readonly_fields = []
exception Repository.DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception Repository.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

Repository.clean(*args, **kwargs)
Repository.distributions
Repository.get_next_by_last_checked(*moreargs, **morekwargs)
Repository.get_previous_by_last_checked(*moreargs, **morekwargs)
Repository.get_status_display(*moreargs, **morekwargs)
Repository.layout
Repository.mbd_build_keyring_packages(request)
Repository.mbd_build_test_packages(request)
Repository.mbd_check(request)
Repository.mbd_distribution_strings(**suiteoption_filter)

Return a list with all full distributions strings, optionally matching a suite options filter (unstable, experimental,...).

Repository.mbd_get_apt_keys(distribution)
Repository.mbd_get_dependencies()
Repository.mbd_get_description(distribution, suite_option)
Repository.mbd_get_dsc_url(distribution, package, version)

Get complete DSC URL of an installed package.

Repository.mbd_get_internal_suite_dependencies(suite_option)
Repository.mbd_get_meta_distributions(distribution, suite_option)
Repository.mbd_get_path()
Repository.mbd_get_uploader_keyring()
Repository.mbd_package_find(package, distribution=None, version=None)
Repository.mbd_package_install(distribution, suite_option, changes, bresults)

Install a dict arch:bres of successful build results.

Repository.mbd_package_list(pattern, typ=None, with_rollbacks=False, dist_regex=u'')
Repository.mbd_package_migrate(package, distribution, suite, rollback=None, version=None, msglog=<logging.Logger object at 0x7f4e45a4cb90>)
Repository.mbd_package_notify(status, distribution, pkg, body, extra=None, message=None, msglog=<logging.Logger object at 0x7f4e45a4cb90>)
Repository.mbd_package_precheck(distribution, suite_option, package, version)
Repository.mbd_package_purge_orphaned_logs(package=None, msglog=<logging.Logger object at 0x7f4e45a4cb90>)
Repository.mbd_package_remove(package, distribution, suite, rollback=None, version=None, msglog=<logging.Logger object at 0x7f4e45a4cb90>)
Repository.mbd_package_show(package)

Result is of the form:

[(CODENAME, [{“distribution”: DIST,
“component”: COMPONENT, “source”: PKG_NAME, “sourceversion”: VERSION, “migrates_to”: DIST, “uploadable”: BOOL, “experimental”: BOOL, “sort_no”: NO, “rollbacks”: [{“no”: 0, “distribution”: DIST, “source”: PKG_NAME, “sourceversion”: VERS0}, ...]}])]
Repository.mbd_prepare(_request)

Idempotent repository preparation. This may be used as-is as mbd_sync.

Repository.mbd_remove(_request)
Repository.mbd_sync(request)
Repository.notify
Repository.objects = <django.db.models.manager.Manager object at 0x7f4e45cd6090>
Repository.uploader_set
class mini_buildd.models.repository.Suite(*args, **kwargs)

Bases: mini_buildd.models.base.Model

Suite(id, extra_options, pickled_data, name)

class Admin(model, admin_site)

Bases: mini_buildd.models.base.Admin

exclude = (u'extra_options',)
mbd_model

alias of Suite

media
exception Suite.DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception Suite.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

Suite.clean(*args, **kwargs)
Suite.layout_set
Suite.objects = <django.db.models.manager.Manager object at 0x7f4e45c6b650>
Suite.suiteoption_set
class mini_buildd.models.repository.SuiteOption(*args, **kwargs)

Bases: mini_buildd.models.base.Model

SuiteOption(id, extra_options, pickled_data, layout_id, suite_id, uploadable, experimental, migrates_to_id, build_keyring_package, auto_migrate_after, not_automatic, but_automatic_upgrades)

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception SuiteOption.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

SuiteOption.clean(*args, **kwargs)
SuiteOption.layout
SuiteOption.mbd_get_apt_pin(repository, distribution)
SuiteOption.mbd_get_apt_preferences(repository, distribution, prio=1)
SuiteOption.mbd_get_distribution_string(repository, distribution, rollback=None)
SuiteOption.mbd_get_sort_no()

Compute number that may be used to sort suites from ‘stable’ (0) towards ‘experimental’.

SuiteOption.migrates_to
SuiteOption.objects = <django.db.models.manager.Manager object at 0x7f4e45c6be90>
SuiteOption.rollback

Rollback field temporarily implemented as extra_option.

SuiteOption.suite
SuiteOption.suiteoption_set
class mini_buildd.models.repository.SuiteOptionInline(parent_model, admin_site)

Bases: django.contrib.admin.options.TabularInline

extra = 1
media
model

alias of SuiteOption

mini_buildd.models.repository.get_meta_distribution_map()

Get a dict of the meta distributions: meta -> actual.

source Module

class mini_buildd.models.source.Architecture(*args, **kwargs)

Bases: mini_buildd.models.base.Model

Architecture(extra_options, pickled_data, name)

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception Architecture.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

Architecture.architectureoption_set
Architecture.chroot_set
Architecture.distribution_set
classmethod Architecture.mbd_host_architecture()
classmethod Architecture.mbd_supported_architectures(arch=None)

Some archs also natively support other archs.

Architecture.objects = <django.db.models.manager.Manager object at 0x7f4e45c16610>
Architecture.source_set
class mini_buildd.models.source.Archive(*args, **kwargs)

Bases: mini_buildd.models.base.Model

Archive(extra_options, pickled_data, url, ping)

class Admin(model, admin_site)

Bases: mini_buildd.models.base.Admin

exclude = (u'extra_options',)
classmethod mbd_meta_add_debian(msglog)

Add internet Debian archive sources.

classmethod mbd_meta_add_from_sources_list(msglog)

Scan local sources list and add all archives found there.

classmethod mbd_meta_add_ubuntu(msglog)

Add internet Ubuntu archive sources.

mbd_model

alias of Archive

media
search_fields = [u'url']
exception Archive.DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception Archive.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

Archive.clean(*args, **kwargs)
Archive.mbd_get_matching_release(request, source, gnupg)
Archive.mbd_get_reverse_dependencies()

Return all sources (and their deps) that use us.

Archive.mbd_ping(request)

Ping and update the ping value.

Archive.objects = <django.db.models.manager.Manager object at 0x7f4e45c16290>
Archive.source_set
class mini_buildd.models.source.Component(*args, **kwargs)

Bases: mini_buildd.models.base.Model

Component(extra_options, pickled_data, name)

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception Component.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

Component.distribution_set
Component.objects = <django.db.models.manager.Manager object at 0x7f4e45c16950>
Component.source_set
class mini_buildd.models.source.PrioritySource(*args, **kwargs)

Bases: mini_buildd.models.base.Model

PrioritySource(id, extra_options, pickled_data, source_id, priority)

class Admin(model, admin_site)

Bases: mini_buildd.models.base.Admin

exclude = (u'extra_options',)
classmethod mbd_meta_add_extras(msglog)

Add all backports as prio=1 prio sources

mbd_model

alias of PrioritySource

media
exception PrioritySource.DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception PrioritySource.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

PrioritySource.distribution_set
PrioritySource.mbd_get_apt_preferences()
PrioritySource.objects = <django.db.models.manager.Manager object at 0x7f4e45c67290>
PrioritySource.source
class mini_buildd.models.source.Source(*args, **kwargs)

Bases: mini_buildd.models.base.StatusModel

Source(id, extra_options, pickled_data, status, last_checked, auto_reactivate, origin, codename, description, codeversion, codeversion_override)

class Admin(model, admin_site)

Bases: mini_buildd.models.base.Admin

fieldsets = ((u'Identity', {u'fields': (u'origin', u'codename', u'extra_options', u'apt_keys')}), (u'Extra', {u'fields': (u'description', u'codeversion', u'codeversion_override', u'archives', u'components', u'architectures'), u'classes': (u'collapse',)}))
filter_horizontal = (u'apt_keys',)
get_readonly_fields(_request, obj=None)

Forbid to change identity on existing source (usually a bad idea; repos/chroots that refer to us may break).

list_display = [u'colored_status', u'__unicode__', u'origin', u'codename']
classmethod mbd_filter_active_base_sources()

Filter active base sources; needed in chroot and distribution wizards.

classmethod mbd_meta_add_debian(msglog)

Add well-known Debian sources

7638D0442B90D010: Debian Archive Automatic Signing Key (8/jessie) <ftpmaster@debian.org> CBF8D6FD518E17E1: Jessie Stable Release Key <debian-release@lists.debian.org>

8B48AD6246925553: Debian Archive Automatic Signing Key (7.0/wheezy) <ftpmaster@debian.org> 6FB2A1C265FFB764: Wheezy Stable Release Key <debian-release@lists.debian.org>

AED4B06F473041FA: Debian Archive Automatic Signing Key (6.0/squeeze) <ftpmaster@debian.org> 64481591B98321F9: Squeeze Stable Release Key <debian-release@lists.debian.org>

9AA38DCD55BE302B: Debian Archive Automatic Signing Key (5.0/lenny) <ftpmaster@debian.org> 4D270D06F42584E6: Lenny Stable Release Key <debian-release@lists.debian.org>

B5D0C804ADB11277: Etch Stable Release Key <debian-release@lists.debian.org> EA8E8B2116BA136C: Backports.org Archive Key <ftp-master@backports.org>

classmethod mbd_meta_add_ubuntu(msglog)

Add well-known Ubuntu sources

mbd_model

alias of Source

media
ordering = [u'origin', u'codename']
readonly_fields = [u'codeversion', u'archives', u'components', u'architectures', u'description']
search_fields = [u'origin', u'codename']
exception Source.DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception Source.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

Source.apt_keys
Source.architectures
Source.archives
Source.chroot_set
Source.components
Source.distribution_set
Source.get_next_by_last_checked(*moreargs, **morekwargs)
Source.get_previous_by_last_checked(*moreargs, **morekwargs)
Source.get_status_display(*moreargs, **morekwargs)
Source.mbd_check(request)

Rescan all archives, and check that there is at least one working.

Source.mbd_get_apt_line(distribution, prefix=u'deb ')
Source.mbd_get_apt_pin()

Apt ‘pin line’ (for use in a apt ‘preference’ file).

Source.mbd_get_archive()

Returns the fastest archive.

Source.mbd_get_dependencies()
Source.mbd_get_reverse_dependencies()

Return all chroots and repositories that use us.

Source.mbd_is_matching_release(request, release)

Check that this release file matches us.

Source.mbd_prepare(request)
Source.mbd_release_file_values()

Compute a dict of values a matching release file must have.

Source.mbd_remove(_request)
Source.mbd_sync(request)
Source.objects = <django.db.models.manager.Manager object at 0x7f4e45c5bbd0>
Source.prioritysource_set
mini_buildd.models.source.cmp_components(component0, component1)

Get Debian components as string in a suitable order – i.e., ‘main’ should be first, the others in alphabetical order.

Basically only needed for reprepro’s (broken?) default component guessing, which uses the first given component in the configuration.

subscription Module

class mini_buildd.models.subscription.Subscription(*args, **kwargs)

Bases: mini_buildd.models.base.Model

Subscription(id, extra_options, pickled_data, subscriber_id, package, distribution)

exception DoesNotExist

Bases: django.core.exceptions.ObjectDoesNotExist

exception Subscription.MultipleObjectsReturned

Bases: django.core.exceptions.MultipleObjectsReturned

Subscription.objects = <django.db.models.manager.Manager object at 0x7f4e45ae4ad0>
Subscription.subscriber