Reputation: 6118
I am pretty beginner with Python
and Django
and I would like to know How I could improve few Python lines with a better Pythonic syntax.
Reasons :
I have two tables : BirthCertificate
and Identity
which have a folderId field
.
This field corresponds to a directory ID in LogicalDOC web application. When I create different PDF documents to the same person, all documents have to go on the same directory thanks to this directory ID.
My objective :
I fill an Identity form
, my function create a new directory if the person doesn't exist (and by the same way, I get a new directory ID) or takes an existing ID directory if the person already exists.
With BirthCertificate table
, I want to know if the same person already exists in Identity table
.
If yes : I take the Identity folderID and I update my BirthCertificate table with this number
If no : I redirect user to Identity form.
Why ?
Because users have to create Identity form before BirthCertificate form.
In my script, When I generate BirthCertificate PDF
to a person X, I want to check before if the person X is already registered in Identity
. If yes, I take the Identity folderID
and put the same number in BirthCertificate folderID
. Else, I redirect to Identity form creation.
This is the interesting part from my script :
if BirthCertificate.objects.get(pk=id).lastname == Identity.objects.get(pk=id).lastname :
if BirthCertificate.objects.get(pk=id).firstname == Identity.objects.get(pk=id).firstname :
if BirthCertificate.objects.get(pk=id).birthday == Identity.objects.get(pk=id).birthday :
if BirthCertificate.objects.get(pk=id).birthcity == Identity.objects.get(pk=id).birthcity :
if Identity.objects.exclude(folderId__isnull=True) :
BirthCertificate.objects.filter(pk=id).update(folderId=Identity.objects.get(pk=id).folderId)
else :
return HttpResponseRedirect(reverse('home'))
How I could improve this Python part in order to check to each step if I can continue to the next one or redirect to home
?
EDIT :
Identity models.py :
#-*- coding: utf-8 -*-
from django.db import models
from django.utils.encoding import force_text
from django_countries.fields import CountryField
######################################
# Choix à l'utilisateur pour le sexe #
######################################
SEX_CHOICES = (
('Masculin', 'Masculin'),
('Feminin', 'Feminin')
)
##########################################
# Choix à l'utilisateur pour la civilité #
##########################################
TITLE_CHOICES = (
('Mr', 'Monsieur'),
('Mlle', 'Mademoiselle'),
('Mme','Madame'),
('Dr','Docteur'),
('Me','Maître'),
)
####################################################################################
# Création d'une table permettant de renseigner toutes les informations concernant #
# les parents et reprise de celles des enfants #
####################################################################################
class Identity(models.Model):
title = models.CharField(max_length=12,choices=TITLE_CHOICES, verbose_name='Civilité')
lastname = models.CharField(max_length=30, verbose_name='Nom de famille')
firstname = models.CharField(max_length=30, verbose_name='Prénom(s)')
sex = models.CharField(max_length=8, choices=SEX_CHOICES, verbose_name='Sexe')
birthday = models.DateField(verbose_name='Date de naissance')
birthcity = models.CharField(max_length=30, verbose_name='Ville de naissance')
birthcountry = CountryField(blank_label='Sélectionner un pays', verbose_name='Pays de naissance')
nationality = models.CharField(max_length=30, verbose_name='Nationalité')
job = models.CharField(max_length=30, verbose_name='Profession')
adress = models.CharField(max_length=30, verbose_name='Adresse')
city = models.CharField(max_length=30, verbose_name='Ville')
zip = models.IntegerField(verbose_name='Code Postal')
country = CountryField(blank_label='Sélectionner un pays', verbose_name='Pays')
mail = models.CharField(max_length=30, verbose_name='Email', blank=True)
phone = models.CharField(max_length=20, verbose_name='Téléphone', blank=True)
folderId = models.CharField(max_length=15, null=True)
def __unicode__(self):
return '%s %s %s %s %s %s %s %s %s %s %s %s %s %s %s %s' % (self.id, self.title, self.lastname, self.firstname, self.sex, self.birthday, self.birthcity, self.birthcountry,
self.nationality, self.job, self.adress, self.city, self.zip, self.country, self.mail, self.phone)
BirthCertificate models.py :
#-*- coding: utf-8 -*-
from django.db import models
from Identity.models import Identity
from django.utils.encoding import force_text
from django_countries.fields import CountryField
######################################
# Choix à l'utilisateur pour le sexe #
######################################
SEX_CHOICES = (
('Masculin', 'Masculin'),
('Feminin', 'Feminin')
)
####################################################################################
# Création d'une table permettant de renseigner toutes les informations concernant #
# l'enfant et reprise des champs pour les parents #
####################################################################################
class BirthCertificate(models.Model):
lastname = models.CharField(max_length=30, null=False, verbose_name='Nom de famille')
firstname = models.CharField(max_length=30, null=False, verbose_name='Prénom(s)')
sex = models.CharField(max_length=8, choices=SEX_CHOICES, verbose_name='Sexe')
birthday = models.DateField(null=False, verbose_name='Date de naissance')
birthhour = models.TimeField(null=True, verbose_name='Heure de naissance')
birthcity = models.CharField(max_length=30, null=False, verbose_name='Ville de naissance')
birthcountry = CountryField(blank_label='Sélectionner un pays', verbose_name='Pays de naissance')
fk_parent1 = models.ForeignKey(Identity, related_name='ID_Parent1', verbose_name='ID parent1', null=False)
fk_parent2 = models.ForeignKey(Identity, related_name='ID_Parent2', verbose_name='ID parent2', null=False)
folderId = models.CharField(max_length=15, null=True)
This is my entire function which lets me to generate PDF file and send it to the good directory :
@login_required
def BirthCertificate_PDF(request, id) :
birthcertificate = get_object_or_404(BirthCertificate, pk=id)
data = {"birthcertificate" : birthcertificate}
template = get_template('BC_raw.html')
html = template.render(Context(data))
filename_directory = str(BirthCertificate.objects.get(pk=id).lastname.encode('utf-8')) + "_" + str(BirthCertificate.objects.get(pk=id).firstname.encode('utf-8')) + "_" + str(BirthCertificate.objects.get(pk=id).birthday)
filename = 'Acte_Naissance_' + filename_directory + '.pdf'
path = '/Users/valentinjungbluth/Desktop/Django/Individus/' + filename
file = open(path, "w+b")
pisaStatus = pisa.CreatePDF(html.encode('utf-8'), dest=file, encoding='utf-8')
file.close()
# Get FolderID from Identity and fill Birthcertificate FolderID field
if BirthCertificate.objects.get(pk=id).lastname == Identity.objects.get(pk=id).lastname :
if BirthCertificate.objects.get(pk=id).firstname == Identity.objects.get(pk=id).firstname :
if BirthCertificate.objects.get(pk=id).birthday == Identity.objects.get(pk=id).birthday :
if BirthCertificate.objects.get(pk=id).birthcity == Identity.objects.get(pk=id).birthcity :
if Identity.objects.exclude(folderId__isnull=True) :
BirthCertificate.objects.filter(pk=id).update(folderId=Identity.objects.get(pk=id).folderId)
else :
return HttpResponseRedirect(reverse('home'))
#elif folderID is not null (corresponding to an existing folder), just save pdf file inside the folder. DON'T CREATE a new one.
if BirthCertificate.objects.filter(pk=id).exclude(folderId__isnull=True) :
payload = '{{ "language":"fr","fileName":"{0}","folderId": "{1}" }}'.format(filename, BirthCertificate.objects.get(pk=id).folderId)
upfile = path
files = {
'document': (None, payload, 'application/json'),
'content': (os.path.basename(upfile), open(upfile, 'rb'), 'application/octet-stream')
}
url = 'http://demoged.datasystems.fr:8090/services/rest/document/create'
headers = {'Content-Type': 'multipart/form-data'}
r = requests.post(url, files=files, headers=headers, auth=('etatcivil', '100%EC67'))
for element in glob.glob(path) :
os.remove(element)
context = {"birthcertificate":birthcertificate,
"path":path,
}
return render(request, 'BC_PDF.html', context)
Upvotes: 1
Views: 95
Reputation: 2974
You can use this query for checking if the same object exist in Identity table
person = BirthCertificate.objects.get(pk=id)
try :
identity_object = Identity.objects.get(firstname=person.firstname, lastname=person.lastname, birthcity=person.birthcity, birthday=person.birthday)
if Identity.objects.exclude(folderId__isnull=True):
BirthCertificate.objects.filter(pk=id).update(folderId=identity_object.folderId)
else :
return HttpResponseRedirect(reverse('home'))
except Identity.DoesNotExist:
HttpResponseRedirect(reverse('home'))
Upvotes: 1
Reputation: 3859
Before anything else you can at least avoid repeating db lookups. For example do this:
identity = Identity.objects.get(pk=id)
birth_certificate = BirthCertificate.objects.get(pk=id)
Then apply your conditional logic on these objects. For example:
if birth_certificate.lastname == identity.lastname and birth_certificate.firstname == identity.firstname:rstname :
# Do something , etc.
Upvotes: 1