Hi i have a problem with updating data which is stored in a model. I would like to update the data which is stored in a model without a form, it is a function which sums up every user transaction and after every change I would like it to update.
my models:
class Portfolio(models.Model):
portfolio_id = models.AutoField(primary_key=True,blank=True)
portfolio_title = models.CharField(unique=True,max_length=200, null=True,blank=True)
user_name = models.ForeignKey(Customer, null=True, on_delete=models.SET_NULL,blank=True)
p_shares_num_sum = models.DecimalField(decimal_places=2,default=0,max_digits=999,editable=True, null=True,blank=True)
p_last_mod_date = models.DateField(auto_now_add=False,null=True,editable=True,blank=True)
p_comp_num_sum = models.DecimalField(decimal_places=2,default=0,max_digits=999,editable=True, null=True,blank=True)
p_to_buy_percentage = models.CharField(max_length=200,editable=True, null=True,blank=True)
p_profit_earned = models.DecimalField(decimal_places=6,editable=True,default=0,max_digits=999, null=True,blank=True)
def __str__(self):
return self.portfolio_title if self.portfolio_title else ''
```
The data which I want to send to it after every entry on site, with function
shares_num = visdata.aggregate(Sum(('shares_number')))
shares_num_sum = (shares_num['shares_number__sum'])
shares_num_sum = format(shares_num_sum, ".0f")
#profit_earned = visdata.aggregate(Sum(('course')))
#profit_sum = (profit_earned['course__sum'])
fare_paid = visdata.aggregate(Sum(('fare')))
fare_sum = (fare_paid['fare__sum'])
mod_date = visdata.order_by('-date').first().date
to_buy = visdata.filter(buy_sell='+').count()
to_sell = visdata.filter(buy_sell='-').count()
to_buy_percentage = 0
to_buy_percentage = to_buy / comp_number
to_buy_percentage = (to_buy_percentage) * 100
to_buy_percentage = format(to_buy_percentage, ".0f")
to_buy_percentage = str(to_buy_percentage) + '%'
#for customer restriction delete object and change VisData to visdata
aggregated_data = visdata.annotate(
intermid_result=F('course') - F('fare')
).annotate(
record_total=F('shares_number') * F('intermid_result')
).aggregate(
total=Sum('record_total')
)
profit_earned = aggregated_data['total']
profit_earned = format(profit_earned, ".2f")
summary_data = [int(shares_num_sum),int(comp_number),mod_date,str(to_buy_percentage),float(profit_earned)]
The function is written and prints me:
[4, 2, datetime.date(2021, 12, 20), '100%', 0.9]
If you have that data from function in your view, just get your current portolio object and asign to it's fields values, then call save() method from that object.
For example:
portfolio_object = Portfolio.objects.get(pk=some_pk)
portfolio_object.some_field = summary_data[0]
... here the rest of values
portfolio_object.save()
Remember that it'll execute every time you open that view, so think about some optimalization.
Related
I have a model AddProduct and StockIn. When a new stock are purchased from dealer than all purchased product are get added in StockIn model. And Existing products are updated in AddProduct model.
My AddProduct models are as follows
class AddProduct(models.Model):
Name = models.CharField(max_length=120,verbose_name="name")
Description = models.CharField(max_length=120, verbose_name="description")
Unit = models.ForeignKey(Unit,on_delete=models.CASCADE,max_length=150,verbose_name='unit')
purchaseRate = models.DecimalField(max_digits=10, decimal_places=3,verbose_name="purchase rate")
AvgRate = models.DecimalField(max_digits=10, decimal_places=3,verbose_name="avg rate")
OpnStock = models.DecimalField(max_digits=10, decimal_places=3,verbose_name="Opening stock")
ClosingStock = models.DecimalField(max_digits=10, decimal_places=3,verbose_name="closing stock")
StoreLocation = models.CharField(max_length=120,verbose_name="store location")
MinStock = models.DecimalField(max_digits=10, decimal_places=3,verbose_name="minimum stock")
ReOrder = models.DecimalField(max_digits=10, decimal_places=3,verbose_name="reorder")
MaxStock = models.DecimalField(max_digits=10, decimal_places=3,verbose_name="maxstock")
Group = models.ForeignKey(ProductGroup,on_delete=models.CASCADE,max_length=150,verbose_name='productgroup')
CGST = models.DecimalField(max_digits=10, decimal_places=3,verbose_name="CGST")
SGST = models.DecimalField(max_digits=10, decimal_places=3,verbose_name="SGST")
IGST = models.DecimalField(max_digits=10, decimal_places=3,verbose_name="IGST")
Validity = models.IntegerField(verbose_name="validity")
Updated = models.DateTimeField(auto_now=True)
while my StockIn model are as follows
class StockIN(models.Model):
GrnNo = models.IntegerField(verbose_name="GrnNo")
Date = models.DateTimeField(default=timezone.now)
Supplier = models.ForeignKey(AddSupplier,on_delete=models.CASCADE,max_length=150,verbose_name='supplier')
InvoiceNo = models.IntegerField(verbose_name="invoice No")
InvoiceDate = models.DateTimeField(default=timezone.now, verbose_name="Invoice Date")
ProductName = models.CharField(max_length=120,verbose_name="productName")
Quantity = models.IntegerField(verbose_name="quantity")
Unit = models.ForeignKey(Unit,on_delete=models.CASCADE,max_length=150,verbose_name='unit')
Rate = models.CharField(max_length=120,verbose_name="rate")
Value = models.CharField(max_length=120,verbose_name="value")
DisPer = models.CharField(max_length=120,verbose_name="disper")
DisValue = models.CharField(max_length=120,verbose_name="disvalue")
Taxable = models.CharField(max_length=120,verbose_name="taxable")
CGSTPER = models.CharField(max_length=120,verbose_name="cgstper")
CGST = models.CharField(max_length=120,verbose_name="cgst")
SGSTPER = models.CharField(max_length=120,verbose_name="sgstper")
SGST = models.CharField(max_length=120,verbose_name="sgst")
IGSTPER = models.CharField(max_length=120,verbose_name="igstper")
IGST = models.CharField(max_length=120,verbose_name="igst")
NetAmt = models.CharField(max_length=120,verbose_name="netamt")
I recieving a list of product details from template. So after submiting the request i am getting the result of print(request.POST) like this.
<QueryDict: {'csrfmiddlewaretoken': ['BKetQA2dIzgRlkLmIJGsZbWB3nzDiQxgR9FHnzN9lmDr86mdEJygUZJ08TORmU3N'], 'GrnNo': ['4'], 'Date': ['2022-03-20'], 'initial-Date': ['2022-03-20 06:09:47'], 'Supplier': ['2'], 'InvoiceNo': ['4444'], 'InvoiceDate': ['2022-03-20'], 'initial-InvoiceDate': ['2022-03-20 06:09:47'], 'productname': ['Safety shoes ','welder'], 'uom': ['0','0'], 'quantity': ['5','6'], 'unit': ['1','1'], 'rate': ['329','220'], 'value': ['1645','1320'], 'disper': ['2','2'], 'disvalue': ['32.9','20.2'], 'taxable': ['0','0'], 'cgstper': ['4','4'], 'cgstvalue': ['64.484','62.2'], 'sgstper': ['4','4'], 'sgstvalue': ['64.484','62.22'], 'igstper': ['4','4'], 'igstvalue': ['64.484','62.22'], 'netamt': ['1612.164.48464.48464.4840','1226.255242'], 'example_length': ['10']}>
This is my purchaseView function where i am doing query and get error as AddProduct matching query does not exist.
def PurchaseView(request):
stockinform = StockInForm()
product = AddProduct.objects.all()
unit = {}
unitobj = Unit.objects.all()
for obj in unitobj:
unit[obj.id]=f'{obj.Name}'
print(request.POST)
if request.method == 'POST':
grnno = request.POST.getlist('GrnNo')
date = request.POST.getlist('Date')
supplier = request.POST.getlist('Supplier')
supplierinstance = AddSupplier.objects.get(id=supplier[0])
invoiceno = request.POST.getlist('InvoiceNo')
invoicedate = request.POST.getlist('InvoiceDate')
productname = request.POST.getlist('productname')
uom = request.POST.getlist('uom'),
quantity = request.POST.getlist('quantity')
unitname = request.POST.getlist('unit')
rate = request.POST.getlist('rate')
value = request.POST.getlist('value')
disper = request.POST.getlist('disper')
disvalue = request.POST.getlist('disvalue')
taxable = request.POST.getlist('taxable')
cgstper = request.POST.getlist('cgstper')
cgstvalue = request.POST.getlist('cgstvalue')
sgstper = request.POST.getlist('sgstper')
sgstvalue = request.POST.getlist('sgstvalue')
igstper = request.POST.getlist('igstper')
igstvalue = request.POST.getlist('igstvalue')
netamt = request.POST.getlist('netamt')
productlen = len(productname)
for i in range(0,productlen):
unitinstance = Unit.objects.get(id=unitname[i])
print(productname[i])
productupdate = AddProduct.objects.get(Name=productname[i])
StockIN.objects.create(GrnNo=grnno[0],
Date=date[0],
Supplier=supplierinstance,
InvoiceNo=invoiceno[0],
InvoiceDate=invoicedate[0],
ProductName=productname[i],
Quantity=quantity[i],
Unit=unitinstance,
Rate=rate[i],
Value=value[i],
DisPer=disper[i],
DisValue=disvalue[i],
Taxable=taxable[i],
CGSTPER=cgstper[i],
CGST=cgstvalue[i],
SGSTPER=sgstper[i],
SGST=sgstvalue[i],
IGSTPER=igstper[i],
IGST=igstvalue[i],
NetAmt=netamt[i])
productupdate.OpnStock = 0
productupdate.ClosingStock = quantity[i]
productupdate.purchaseRate = rate[i]
productupdate.CGST = cgstper[i]
productupdate.SGST = sgstper[i]
productupdate.IGST = igstper[i]
productupdate.save()
return render(request, "stock/purchase.html",{"form":stockinform,"products":product,"unit":unit})
When i am testing django shell then all things working fine.
but after submiting the form in template this is not working. I don't know why. Please help me bro
Since you're querying your model inside loop i will suggest inspecting values in a log or console when error comes up also i will suggest using StockIN.objects.bulk_create() instead of creating items instead in loop
I have the same question/problem than this post -> peewee - modify db model meta (e.g. schema) dynamically . I want to change the schema field in my Meta class dynamically. This is my code:
class GPSPosition(Model):
def __init__(self, esquema, vehiculo, fechaFrom):
self.esquema = esquema + '_org'
self.vehiculo = vehiculo
self.fechaFrom = fechaFrom
orgid = BigIntegerField()
id = BigIntegerField()
vehicleid = BigIntegerField()
driverid = BigIntegerField()
originaldriverid = BigIntegerField(null=False)
blockseq = IntegerField(null=False)
time = DateTimeField(null=False)
latitude = FloatField(null=False)
longitude = FloatField(null=False)
altitude = SmallIntegerField(null=False)
heading = SmallIntegerField(null=False)
satellites = SmallIntegerField(null=False)
hdop = FloatField(null=False)#float
ageofreading = IntegerField(null=False)
distancesincereading = IntegerField(null=False)
velocity = FloatField(null=False)
isavl = BooleanField(null=False)
coordvalid = BooleanField(null=False)
speedkilometresperhour = DecimalField(null=False)
speedlimit = DecimalField(null=False)
vdop = SmallIntegerField(null=False)
pdop = SmallIntegerField(null=False)
odometerkilometres = DecimalField(null=False)
formattedaddress = CharField(null=False)
source = CharField(null=False)
class Meta:
database = db
schema = esquema
db_table = 'test_gpspositions'
primary_key = CompositeKey("orgid", "id")
Can someone please show me the light about this? Thanks!
Well I'll answer my own question since I found the answer time ago and it's very simple, just add this 1-2 lines at the point you want to change the schema name:
schemaname = 'your_schema_name'
setattr(YourPeeweeModel._meta, "schema", schemaname)
Works fine.
Im stumped and need help on my function.
I have two tables student and student information. Student information is all guardian information of that student. I separated this data from the main student table so you can add as many guardians as you want to a students file with new records. The error I'm getting is as followed.
Cannot assign "'1'": "StudentInformation.studentpsid" must be a "Student" instance.
Attached you will see my code. Studentpsid in student information is a foreign key from student.
def ImportStudentGuardian(request):
AuthTokenP(request)
print("Getting student guardian data from SIS for K-8")
#Pulls K-8 Guardians
url = "removed for posting"
payload = {}
token = APIInformation.objects.get(api_name="PowerSchool")
key = token.key
headers = {'Authorization': 'Bearer {}'.format(key)}
response = requests.request("GET", url, headers=headers, data = payload)
encode_xml = response.text.encode('utf8')
xml_string = ET.fromstring(encode_xml)
students = xml_string.findall("student")
for student in students:
#XML Values
psid = student.find("id").text
try:
mother = student.find("contact").find("mother").text
except Exception:
mother = ""
try:
father = student.find("contact").find("father").text
except Exception:
father = ""
if Student.objects.filter(studentpsid=psid).exists():
print("Accessing guardian information.")
m = StudentInformation.objects.create(studentpsid=psid,guardian_name = mother, relation = "Mom") <---- Function Fails here
print("Record doesn't exist for mom, creating record.")
m.save()
d= StudentInformation.objects.create(studentpsid=psid,guardian_name = father, relation = "Dad")
print("Record doesn't exist for dad, creating record.")
d.save()
return ("Updated Guardian Information ")
Model
class Student(models.Model):
studentpsid= models.CharField(primary_key = True , default = "", max_length = 50, unique = True)
student_name = models.CharField(max_length = 50)
first_name = models.CharField(max_length = 50, default = "")
last_name = models.CharField(max_length = 50,default = "")
gender = models.CharField(max_length = 1,default = "")
student_grade = models.CharField(max_length = 2, default = "")
home_room = models.CharField(max_length = 5, default = "")
student_enrollment = models.CharField(max_length = 2, default = "")
school_number = models.CharField(max_length = 15, default = "")
email = models.EmailField(default = "")
projected_graduation_year = models.CharField(max_length = 4, default = "")
counseling_goal = models.TextField(max_length = 255)
class_name = models.ManyToManyField(TeacherClass)
image = models.ImageField(default ="default.png", upload_to ='student_pics')
# Guardian Information For Student
class StudentInformation(models.Model):
studentpsid = models.ForeignKey(Student,on_delete = models.CASCADE, default = "" ,)
guardian_name = models.CharField(max_length = 50, default = "")
RELATION_CHOICES = [
(0, 'None'),
(1, 'Mom'),
(2, 'Dad'),
(3, 'Other'),
]
relation = models.PositiveSmallIntegerField(choices = RELATION_CHOICES,)
guardian_cell = models.CharField(max_length = 12, default = "")
guardian_email = models.EmailField(max_length = 80,blank = True, default = "")
prefered_contact = models.BooleanField(default = False, blank = True)
DAY_CHOICES = [
(0, 'None'),
(1, 'Monday'),
(2, 'Tuesday'),
(3, 'Wednesday'),
(4, 'Thursday'),
(5, 'Friday'),
]
day_of_week = models.PositiveSmallIntegerField(choices = DAY_CHOICES, default = 0 )
time = models.CharField(max_length= 7, default = "", blank = True)
While creating a record with the foreign key relation, and instance of the related table should be provided, so the table can maintain a relationship for that particular record.
Get the instance of the Student table with the given psid and use that while creating the StudentInformation record
EDIT : Included the part for creating the record only if mother and father values are available.
for student in students:
#XML Values
psid = student.find("id").text
try:
psid_obj = Student.objects.get(studentpsid=psid) #(pk = psid) also works as the field is primary key
try:
mother = student.find("contact").find("mother").text
m = StudentInformation.objects.create(studentpsid=psid_obj,guardian_name = mother, relation = "Mom")
m.save()
except Exception as err1:
print "Error at Mom", str(err1)
try:
father = student.find("contact").find("father").text
d= StudentInformation.objects.create(studentpsid=psid_obj,guardian_name = father, relation = "Dad")
d.save()
except Exception as err2:
print "Error at Dad",str(err2)
except:
print "Student Record Not found"
As the error says, you are assigning a char data type to the ForeignKey field.
You should first get the instance of that Student, and then assign it to your StudentInformation object, like this:
if Student.objects.filter(studentpsid=psid).exists():
print("Accessing guardian information.")
student = Student.objects.get(pk=psid) # this will fail if the student doesn't exist
m = StudentInformation.objects.create(studentpsid=student,guardian_name = mother, relation = "Mom") <---- Function Fails here
print("Record doesn't exist for mom, creating record.")
m.save()
d= StudentInformation.objects.create(studentpsid=student,guardian_name = father, relation = "Dad")
print("Record doesn't exist for dad, creating record.")
d.save()
return ("Updated Guardian Information ")
I create new record with the method named create() in local database with data pulled away from remote database.As we all know,there are four normal fields in Odoo such as create_date,write_date,create_uid,write_uid.I want these data to be in a remote databaseļ¼but when I use method named create() to create the record,these data are the data at the time of local creation and not the remote data.
For example,in remote database,the creat_date is '2019-10-11',I can't change the value that is finally written to the local database even if I pass the value of the remote database into the dictionary.Finally,the value of field named create_date is '2019-12-03' rather than '2019-10-11'.The '2019-12-03' is the date now.The situation is similar for other fields such as write_date,create_uid,write_uid.
Please help me,thanks to everyone who thought about this question.
Following is my code.
The Class Model
class ReportRentalIncomeFromProperty(models.Model):
_name = 'report.rental.income.from.property'
_description = 'The report about the income from property rental'
_order = 'product_id, start_date'
# create_date = fields.Datetime('Created on')
create_uid = fields.Char('Created by')
# write_date = fields.Datetime('Last Modified on')
write_uid = fields.Char('Last Contributor')
product_id = fields.Many2one('product.product', 'Property House')
area_id = fields.Many2one('res.country.area', 'City')
district_id = fields.Many2one('res.country.district', 'District')
town_id = fields.Many2one('res.country.town', 'Town')
road_name = fields.Char('Road')
start_date = fields.Date('Start Date')
end_date = fields.Date('End Date')
should_pay = fields.Float('Should Pay')
real_pay = fields.Float('Real Pay')
balance_pay = fields.Float('Balance Pay')
rental_compliance_rate = fields.Float('Rental Compliance Rate(%)', group_operator="avg")
company_id = fields.Many2one('res.company', string='Company')
parent_company_id = fields.Many2one('res.company', related='company_id.parent_id', store=True,
string='Parent Company')
actual_business = fields.Many2many(
'rh.commercial.activities',
'house_rental_rent_income_business_db',
'actual_business_id',
'commercial_activities_id',
string='Actual business')
The function to pull away remote data to create new record in local database.
#api.multi
def synchronization_contract_performance_rate(self):
self.env['report.rental.income.from.property'].search([]).unlink()
product_dict = {}
A_product = self.env['product.product'].search([])
for a in A_product:
product_dict[a.name] = a.id
activities_dict = {}
D_activities = self.env['rh.commercial.activities'].search([])
for d in D_activities:
activities_dict[d.name] = d.id
address_dict = {}
i = 0
address_model_list = ['res.country.area', 'res.country.district', 'res.country.town']
address_field_list = ['area_id', 'district_id', 'town_id']
for addr in address_model_list:
C_address = self.env[addr].search([])
addr_dict = {}
for c in C_address:
addr_dict[c.name] = c.id
address_dict[i] = addr_dict
i += 1
record_list_1 = self.company_recursive_func()
for list_1 in record_list_1:
database = list_1[0]
link_url = list_1[1]
if link_url.startswith('http://'):
_uri = link_url.replace('http://', '')
my_odoo = odoorpc.ODOO(_uri, port=48080)
if link_url.startswith('https://'):
_uri = link_url.replace('https://', '')
my_odoo = odoorpc.ODOO(_uri, port=443, protocol='jsonrpc+ssl')
username = list_1[2]
password = list_1[3]
my_odoo.login(database, username, password)
company_id = list_1[4]
company_code = list_1[5]
product_actual_business_dict = {}
A_product_actual_business_ids = my_odoo.env['product.product'].search([])
A_product_actual_business = my_odoo.execute('product.product', 'read', A_product_actual_business_ids,
['actual_business'])
for a in A_product_actual_business:
name_list = []
for b in my_odoo.execute('rh.commercial.activities', 'read', a.get('actual_business'), ['name']):
name_list.append(b.get('name'))
product_actual_business_dict[a.get('id')] = name_list
remote_ids = my_odoo.env['report.rental.income.from.property'].search([])
remote_data_dict = my_odoo.execute('report.rental.income.from.property', 'read', remote_ids, ['product_id',
'start_date',
'create_date',
'create_uid',
'write_date',
'write_uid',
'end_date',
'should_pay',
'balance_pay',
'real_pay',
'rental_compliance_rate',
'area_id',
'road_name',
'district_id',
'town_id'])
for data in remote_data_dict:
remote_product_name = data.get('product_id')[1]
product_id = product_dict.get(remote_product_name + '(' + company_code + ')',
None)
if product_id:
i = 0
address_id_list = []
for address_field in address_field_list:
if data.get(address_field):
remote_address_name = data.get(address_field)[1]
local_address_id = address_dict[i].get(remote_address_name, None)
address_id_list.append(local_address_id)
else:
address_id_list.append(None)
i += 1
ids_list = []
find_names = product_actual_business_dict.get(data.get('product_id')[0])
for find_name in find_names:
id = activities_dict.get(find_name, None)
if id:
ids_list.append(id)
value = {
'product_id': product_id,
'area_id': address_id_list[0],
'district_id': address_id_list[1],
'town_id': address_id_list[2],
'road_name': data['road_name'],
'start_date': data['start_date'],
'end_date': data['end_date'],
'should_pay': data['should_pay'],
'real_pay': data['real_pay'],
'create_date': data['create_date'],
'create_uid': data['create_uid'][1],
'write_date': data['write_date'],
'write_uid': data['write_uid'][1],
'balance_pay':data['balance_pay'],
'rental_compliance_rate': data['rental_compliance_rate'],
'company_id': company_id,
'actual_business': [(6, 0, ids_list)]
}
self.env['report.rental.income.from.property'].create(value)
my_odoo.logout()
You can change standart odoo fields after you create your record with sql query
property_id = self.env['report.rental.income.from.property'].create(value)
self.env.cr.execute("UPDATE report_rental_income_from_property SET create_date='%s', create_uid=%s, write_date='%s', write_uid=%s WHERE id=%s" %
(value['create_date'], value['create_uid'], value['write_date'], value['write_uid'], property_id))
I have two that same methods, one working in form view for record and second is for cron.
When i run action in Form view everything is OK, i can get value :
self.deadline = deadlines[0][0]
but when i run in cron:
emp.debug = deadlines[0][0]
i have IndexError: list index out of range
but emp.debug = deadlines works
Full code:
class UserProfile(models.Model):
_name = 'users.profile'
user_id = fields.Many2one(related='project_id.user_id', string='User')
partner_id = fields.Many2one('res.partner', 'Partner')
follower_id = fields.Many2one('mail.followers', 'Follower')
project_id = fields.Many2one('project.project', 'Project')
# project_start_date # TODO max date from deadlines
project_active = fields.Boolean(related='project_id.active', string='Project active')
project_percent = fields.Float(related='project_id.x_project_percent', string='Project percent')
project_money = fields.Float(related='project_id.x_project_money_share')
# project_money_paid = fields.Char(related='project_id.x_paid_debug')
project_sale = fields.Many2one(related='project_id.x_sales_id', string='Sales')
deadline = fields.Many2one('project.project.deadlines', 'Deadline')
deadline_date = fields.Datetime(related='deadline.end_date')
debug = fields.Text()
def get_closest_date(self): # In form view
find_deadlines = self.env["project.project.deadlines"].search([('project_id', '=', self.project_id.id)])
deadlines = []
for record in find_deadlines:
datetime_without_tz = datetime.datetime.strptime(record.end_date, "%Y-%m-%d %H:%M:%S")
record_id = record.id
delta = datetime_without_tz - datetime.datetime.now()
delta_in_seconds = int(delta.total_seconds())
if delta_in_seconds > 0:
deadlines.append((record_id, delta_in_seconds))
deadlines.sort(key=itemgetter(1))
self.deadline = deadlines[0][0] # No indexError i can get value
self.debug = self.env["users.profile"].search([])[0].project_id.id
#api.model
def get_closest_date2(self): # For cron
emp_details_all = self.env["users.profile"].search([])
for emp in emp_details_all:
find_deadlines = self.env["project.project.deadlines"].search([('project_id', '=', emp.project_id.id)])
deadlines = []
for record in find_deadlines:
datetime_without_tz = datetime.datetime.strptime(record.end_date, "%Y-%m-%d %H:%M:%S")
record_id = record.id
delta = datetime_without_tz - datetime.datetime.now()
delta_in_seconds = int(delta.total_seconds())
if delta_in_seconds > 0:
deadlines.append((record_id, delta_in_seconds))
deadlines.sort(key=itemgetter(1))
emp.debug = deadlines[0][0] # IndexError
In the cron method you are looping over all users profiles so it seems like the error message IndexError is shown for a different record.
Check the deadlines variable in get_closest_date2 method before trying to get some value.