Skip to content

Instantly share code, notes, and snippets.

@RaD
Created September 29, 2016 22:22
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save RaD/94caf0ed77db16336f36b6f893922960 to your computer and use it in GitHub Desktop.
Save RaD/94caf0ed77db16336f36b6f893922960 to your computer and use it in GitHub Desktop.
Some Django related stuff
# -*- 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