Created
September 29, 2016 22:22
-
-
Save RaD/94caf0ed77db16336f36b6f893922960 to your computer and use it in GitHub Desktop.
Some Django related stuff
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
import os | |
from datetime import timedelta | |
from django.utils import timezone | |
from django.db import models | |
from django.utils.translation import ugettext_lazy as _ | |
class Vehicle(models.Model): | |
CAT_MOTO = 'M' | |
CAT_CAR = 'C' | |
CAT_TRUCK = 'T' | |
CAT_BUS = 'B' | |
CAT_CHOICES = ( | |
(CAT_MOTO, _(u'moto')), | |
(CAT_CAR, _(u'car')), | |
(CAT_TRUCK, _(u'truck')), | |
(CAT_BUS, _(u'bus')) | |
) | |
title = models.CharField(max_length=64) | |
category = models.CharField(max_length=1, choices=CAT_CHOICES) | |
registered = models.DateTimeField(auto_now_add=True) | |
class Meta: | |
verbose_name = _(u'vehicle') | |
verbose_name_plural = _(u'vehicles') | |
ordering = ('-registered') | |
def __unicode__(self): | |
return u'{} - {}'.format(self.title, self.category) | |
HTML = """ | |
<table> | |
<thead> | |
<tr>{% trans "Registered" %}</tr> | |
<tr>{% trans "Title" %}</tr> | |
<tr>{% trans "Category" %}</tr> | |
<thead> | |
<tbody> | |
{% for item in object_list %} | |
<tr> | |
<td>{{ item.registered | date:"d.m.Y" }}</td> | |
<td>{{ item.title }}</td> | |
<td>{{ item.category }} "{{ item.get_category_display }}"</td> | |
</tr> | |
{% endfor %} | |
</tbody> | |
</table> | |
""" | |
class Procedure(models.Model): | |
title = models.CharField(max_length=128) | |
registered = models.DateTimeField(auto_now_add=True) | |
class Meta: | |
verbose_name = _(u'procedure') | |
verbose_name_plural = _(u'procedures') | |
ordering = ('-registered') | |
def __unicode__(self): | |
return self.title | |
class ProcLogException(Exception): | |
pass | |
class ProcLogQuerySet(models.QuerySet): | |
def by_employee(self, employee): | |
return self.objects.filter(employee=employee) | |
def by_action(self, action): | |
return self.objects.filter(action=action) | |
class ProcLogQueryManager(models.Manager): | |
pass | |
ProcLogManager = ProcLogQueryManager.from_queryset(ProcLogQuerySet) | |
class ProcLog(models.Model): | |
employee = models.ForeignKey('auth.User') | |
action = models.ForeignKey(Procedure) | |
registered = models.DateTimeField(auto_now_add=True) | |
objects = ProcLogManager() | |
class Meta: | |
verbose_name = _(u'proc log') | |
verbose_name_plural = _(u'proc logs') | |
ordering = ('-registered') | |
def __unicode__(self): | |
return u'{} - {}'.format(self.employee, self.action) | |
def exists(self): | |
today = timezone.now().date() | |
qs = self.objects.filter(employee=self.employee, | |
action=self.action, | |
registered__contains=today) | |
return qs.count > 0 | |
def save(self, *args, **kwargs): | |
if not self.pk: | |
if self.exists(): | |
raise ProcLogException('employee already registered an action today') | |
super(ProcLog, self).save(*args, **kwargs) | |
last_action = ProcLog.objects.by_employee(employee).first() | |
count_actions = ProcLog.objects.by_action(action).count() | |
for item in ProcLog.objects.order_by('registered'): | |
print(item) | |
two_days = timezone.now() - timedelta(days=2) | |
qs_per_two_days = ProcLog.objects.filter(registered_gt=two_days) | |
proc1 = Procedure.objects.create(title='1') | |
proc2 = Procedure.objects.create(title='2') | |
proc_list = [proc1, proc2] | |
qs_count = ProcLog.objects.filter(action__in=proc_list).count() | |
someday = timezone.now().date() | |
qs = ProcLog.objects.exclude(registered__contains=someday) | |
from django.contrib import admin | |
class ProcedureAdmin(admin.ModelAdmin): | |
list_display = ('title', 'registered') | |
admin.site.registered(Procedure, ProcedureAdmin) | |
class ProcLogAdmin(admin.ModelsAdmin): | |
list_display = ('employee', 'action', 'registered') | |
admin.site.registered(ProcLog, ProcLogAdmin) | |
from django import forms | |
from django import shortcuts | |
class ProcLogForm(forms.ModelForm): | |
class Meta: | |
model = ProcLog | |
fields = ('action') | |
def clean(self): | |
cleaned_data = super(ProcLogForm, self).clean() | |
employee = cleaned_data.get('employee') | |
action = cleaned_data.get('action') | |
today = timezone.now().date() | |
qs = self._meta.model.objects.filter(employee=employee, action=action, | |
registered__contains=today) | |
if qs.count() > 0: | |
raise forms.ValidationError('already registered') | |
return cleaned_data | |
def proc_log_view(request): | |
form = ProcLogForm(request.POST or None) | |
if request.method == 'POST' and form.is_valid(): | |
obj = form.save(commit=False) | |
obj.employee = request.User | |
obj.save() | |
return shortcuts.redirect(proc_log_view) | |
context = {'form': form} | |
template_name = os.path.join('app_name', 'proc_log.html') | |
return shortcuts.render(request, template_name, context) | |
import logging | |
class UserLog(models.Model): | |
ip = models.GenericIPAddressField(protocol='IPv4') | |
url = models.CharField(max_length=256) | |
registered = models.DateTimeField() | |
class UserLogMiddlware(object): | |
def process_request(self, request): | |
ip = request.META.get('REMOTE_ADDR') | |
url = request.path | |
ts = timezone.now() | |
msg = u'IP {} requested {} at {}'.format(ip, url, ts) | |
logging.info(msg) | |
UserLog.objects.create(ip=ip, url=url, registered=ts) | |
import threading | |
lock = threading.RLock() | |
with lock: | |
some_critical_code() | |
from django.db import transaction | |
@transaction.atomic | |
def unstable_view(request): | |
for i in range(5): | |
SomeObject.objects.create(i) | |
... |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment