Download - I regret nothing

Transcript
Page 1: I regret nothing

I REGRET NOTHING

You can’tjudge me

Page 2: I regret nothing

Priorities on model.save()

device = Device.objects.get(sn=‘1234567890’)

device.barcode = ‘46262’device.save()

Page 3: I regret nothing

from django.db import models as db

class Device(db.Model): name = db.CharField(verbose_name=_("name"), max_length=255) parent = db.ForeignKey('self', verbose_name=_("parent device"), on_delete=db.SET_NULL, null=True, blank=True, default=None, related_name="child_set") model = db.ForeignKey(DeviceModel, verbose_name=_("model"), null=True, blank=True, default=None, related_name="device_set", on_delete=db.SET_NULL) sn = db.CharField(verbose_name=_("serial number"), max_length=255, unique=True, null=True, blank=True, default=None) barcode = db.CharField(verbose_name=_("barcode"), max_length=255, unique=True, null=True, blank=True, default=None) remarks = db.TextField(verbose_name=_("remarks"), help_text=_("Additional information."), blank=True, default="") boot_firmware = db.CharField(verbose_name=_("boot firmware"), null=True, blank=True, max_length=255) hard_firmware = db.CharField(verbose_name=_("hardware firmware"), null=True, blank=True, max_length=255)# ...

Page 4: I regret nothing

Device

Manual data entry

Puppet plugin

SNMP plugin

SSH plugin

Page 5: I regret nothing

Loss of information

SNMP

• Device has a CPU1

Puppet

• Device has a Xeon E5645 @ 2.4 GHz

SNMP

• Device has a CPU1

12:01 12:02 12:37

Page 6: I regret nothing

device.save(priority=plugin.priority)

SNMP

• Device has a CPU1

Puppet

• Device has a Xeon E5645 @ 2.4 GHz

SNMP

• Attribute change ignored

• Device still has a Xeon E5645 @ 2.4 GHz

12:01 12:02 12:37P=10

P=20

P=10

Page 7: I regret nothing

Manual data entry by a human user

P= 1000

Page 8: I regret nothing
Page 9: I regret nothing

from django.db import models as db

class Device(db.Model): name = db.CharField(verbose_name=_("name"), max_length=255) parent = db.ForeignKey('self', verbose_name=_("parent device"), on_delete=db.SET_NULL, null=True, blank=True, default=None, related_name="child_set") model = db.ForeignKey(DeviceModel, verbose_name=_("model"), null=True, blank=True, default=None, related_name="device_set", on_delete=db.SET_NULL) sn = db.CharField(verbose_name=_("serial number"), max_length=255, unique=True, null=True, blank=True, default=None) barcode = db.CharField(verbose_name=_("barcode"), max_length=255, unique=True, null=True, blank=True, default=None) remarks = db.TextField(verbose_name=_("remarks"), help_text=_("Additional information."), blank=True, default="") boot_firmware = db.CharField(verbose_name=_("boot firmware"), null=True, blank=True, max_length=255) hard_firmware = db.CharField(verbose_name=_("hardware firmware"), null=True, blank=True, max_length=255)# ...

Page 10: I regret nothing
Page 11: I regret nothing

Multiple inheritance

Page 12: I regret nothing

class Article(Localized, Titled, Slugged, Categorized, Taggable, AbstractArticle, TimeTrackable, EditorTrackable, Publishable, Commentable, DisplayCounter, HasShowContent):

class Meta: verbose_name = _("article") verbose_name_plural = _("articles")

Page 13: I regret nothing

class EditorTrackable(db.Model): created_by = db.ForeignKey( EDITOR_TRACKABLE_MODEL, verbose_name=_("created by"), null=True, blank=True, default=None, related_name='+', on_delete=db.SET_NULL, limit_choices_to={'is_staff’ if EDITOR_TRACKABLE_MODEL is User else 'user__is_staff': True}) modified_by = db.ForeignKey( EDITOR_TRACKABLE_MODEL, verbose_name=_("modified by"), null=True, blank=True, default=None, related_name='+', on_delete=db.SET_NULL, limit_choices_to={'is_staff’ if EDITOR_TRACKABLE_MODEL is User else 'user__is_staff': True})

Page 14: I regret nothing
Page 15: I regret nothing

class EditorTrackable(db.Model): created_by = db.ForeignKey( EDITOR_TRACKABLE_MODEL, verbose_name=_("created by"), null=True, blank=True, default=None, related_name='+', on_delete=db.SET_NULL, limit_choices_to={'is_staff’ if EDITOR_TRACKABLE_MODEL is User else 'user__is_staff': True}) modified_by = db.ForeignKey( EDITOR_TRACKABLE_MODEL, verbose_name=_("modified by"), null=True, blank=True, default=None, related_name='+', on_delete=db.SET_NULL, limit_choices_to={'is_staff’ if EDITOR_TRACKABLE_MODEL is User else 'user__is_staff': True})

Page 16: I regret nothing
Page 17: I regret nothing

Monkey patching

Traceback (most recent call last): ...TypeError: save() got an unexpected keyword argument 'priority'

Page 18: I regret nothing

from django.db import models

models.Model._lck_save = models.Model.save

models.Model.save = (lambda self, force_insert=False, force_update=False, using=None, *args, **kwargs: self._lck_save(force_insert, force_update, using))

Page 19: I regret nothing
Page 20: I regret nothing

Null

data['INFRA2']['MANAGERS']['MANAGER'][0]['POWERLEVEL']

Page 21: I regret nothing

# bad solution 1if 'INFRA2' in d: if 'MANAGERS' in d['INFRA2’]: if 'MANAGER' in d['INFRA2']['MANAGERS']: if len(d['INFRA2']['MANAGERS']): if 'POWERLEVEL' in d['INFRA2']['MANAGERS']\ ['MANAGER'][0]: return d['INFRA2']['MANAGERS']['MANAGER']\ [0]['POWERLEVEL’]return None

# bad solution 2data.get('INFRA2', {}).get('MANAGERS', {}).get('MANAGER', {}).get(0, []).get('POWERLEVEL’)

# bad solution 3try: return data['INFRA2']['MANAGERS']['MANAGER'][0]\ ['POWERLEVEL']except (KeyError, IndexError): return None

Page 22: I regret nothing

>>> from null import Null>>> Null.any_attributeNull>>> Null['any_key’]Null>>> Null[123]Null>>> Null.any_method()Null>>> bool(Null)False

# solution 4>>> from null import nullify>>> data = nullify(data)>>> data['INFRA2']['MANAGERS']['MANAGER'][0]\ ['POWERLEVEL’]Null

Page 23: I regret nothing
Page 24: I regret nothing

locals()

Page 25: I regret nothing

def messages(request): template='messages/list.html' user = request.user message_list = Message.objects.filter( owner=user) return render_to_response( template, {'message_list': message_list, 'user': user}, context_instance=RequestContext(request))

Page 26: I regret nothing

def messages(request): template='messages/list.html' user = request.user message_list = Message.objects.filter( owner=user) return render_to_response( template, {'message_list': message_list, 'user': user}, context_instance=RequestContext(request))

@viewdef messages(request): template = 'messages/list.html’ user = request.user message_list = Message.objects.filter( owner=user) return locals()

Page 27: I regret nothing
Page 28: I regret nothing

Class context

GENDER_MALE = 0GENDER_FEMALE = 1GENDER_NOT_SPECIFIED = 2GENDER_CHOICES = ( (GENDER_MALE, _('male')), (GENDER_FEMALE, _('female')), (GENDER_NOT_SPECIFIED, _('not specified')),)

class User(db.Model): gender = db.IntegerField(_("gender"), choices=GENDER_CHOICES)

Page 29: I regret nothing

Class context

class Gender(Choices):

male = Choice(_("male")) female = Choice(_("female")) not_specified = Choice(_("not specified"))

class User(db.Model): gender = ChoiceField(_("gender"), choices=Gender, default=Gender.not_specified)

Page 30: I regret nothing

Class context

class Gender(Choices): _ = Choices.Choice male = _("male") female = _("female") not_specified = _("not specified")

class User(db.Model): gender = ChoiceField(_("gender"), choices=Gender, default=Gender.not_specified)

Page 31: I regret nothing
Page 32: I regret nothing

Operators

class User(db.Model): gender = ChoiceField(_("gender"), choices=Gender, default=Gender.not_specified)

def greet(self): if self.gender == Gender.male: return "Hi, boy.” elif self.gender == Gender.female: return "Hello, girl.” else: return "Hey there, user!"

Page 33: I regret nothing

Operators

class Gender(Choices): male = _("male") << {'hello': 'Hi, boy.’} female = _("female") << {'hello': 'Hello, girl.’} not_specified = _("not specified") << { 'hello': 'Hey there, user!’}

class User(models.Model): gender = ChoiceField(choices=Gender, default=Gender.not_specified)

def greet(self): return self.gender.hello

Page 34: I regret nothing
Page 35: I regret nothing

I can do this all day

Page 36: I regret nothing

Conditional fields/methods

class ArticlePage(DisplayCounter, HasShowContent): article = db.ForeignKey(Article, verbose_name=_("article")) page_number = db.PositiveIntegerField( verbose_name=_("page number"), default=None, null=True, blank=True) #...

if settings.CUSTOMER_PAID_FOR_PRINTING_SUPPORT: def print(self): ...

Page 37: I regret nothing

Injecting context by execfile

# settings.pyfrom lck.django import current_dir_supportexecfile(current_dir_support)

# ...STATIC_ROOT = CURRENT_DIR + 'static'

Page 38: I regret nothing
Page 39: I regret nothing

YOU CAN’TJUDGE ME

ambvat #python-dev IRC

@llangaon Twitter

[email protected] a last resort