Blender-Pipeline/studio/analytics.py

245 lines
9.7 KiB
Python

# THIS FILE IS A PART OF VCStudio
# PYTHON 3
import os
import datetime
#from studio import checklist
import checklist
def get_legacy(project_location):
# This function will return analytics data about a project. This particular
# function is desinged to read old, Blender-Organizer projects. It's a first
# step of conversion. And used to display basic analitycs into the
# project-manager.
data = {
"name" : "", # Name of the project (typed properly)
"director" : "", # Name of the project's director.
"status" : "", # Projects's comment / type
"donework" : 0.0, # Percentage of Assets and Scenes done
"fraction" : 0.0, # Project's completion percentage
"checklist" : 0.0, # Project's main checklist percentage
"startdate" : "0000/00/00", # Date of the start of the project
"deadline" : "0000/00/00", # Date when project's deadline is
"duration" : 0, # Amount in days between startdate and deadline
"timepassed" : 0.0, # Percentage of how much time had passed
"dayspassed" : 0, # Amount of days since the startdate
"chr_factor" : 1, # Importance factor for Characters
"veh_factor" : 1, # Importance factor for Vehicles
"loc_factor" : 1, # Importance factor for Locations
"obj_factor" : 1, # Importance factor for Objects (Other)
"rnd_factor" : 1, # Importance factor for Scenes (Renders)
"chr" : 0.0, # Percentage of Characters done
"veh" : 0.0, # Percentage of Vehicles done
"loc" : 0.0, # Percentage of Locations done
"obj" : 0.0, # Percentage of Objects (Other) done
"rnd" : 0.0, # Percentage of Scenes (Renders) done
"dates" : {} # Per date, detailed data about the project
}
# Okay let's get the name, director and status from the old file. Funny that
# it still survived from so far back. In the Organizer 1.0 you had to manually
# type in the number of assets that had to be done in each category.
# And so for this task was created a file called "project.data". Here is
# an example :
# Project :Moria's Race
# Status :Short Action Driving Film
# Director :J.Y.Amihud
# Character:1
# Locations:1
# Objects :1
# Vehicles :1
# Scenes :4
# So that's survived up to the last Blender-Organizer. But no longer the
# last 5 lines were utilized. I was using it mainly for the first 3 things.
# Tho from a version 4.85 of Blender-Organizer those last lines were used
# to controll the influence factor. Basically the number stored will multiply
# the number of times a given category is counted in the final percentage.
# For example animating scenes should take more then half the time of the
# project. More then 50% of the project then should be in the scenes. But
# previous / primitive algorythm was giving each category an even 20%. So
# of course I fixed it. LOL.
# I think for VCStudio I gonna make a more unified file format. That will
# unite all "project.data", "percentage_hystory.data", "history.data" and
# "schedule.data".
# I'm going to still have the main checklist separate tho. The checklist
# format is quite good.
projectdata = open(project_location+"/project.data")
projectdata = projectdata.read()
projectdata = projectdata.split("\n")
for line in projectdata:
if line.startswith("Project"):
data["name"] = line[line.find(":")+1:]
elif line.startswith("Status"):
data["status"] = line[line.find(":")+1:]
elif line.startswith("Director"):
data["director"] = line[line.find(":")+1:]
# Next up some integer conversions. So...
elif line.startswith("Character"):
try:
data["chr_factor"] = int(line[line.find(":")+1:])
except:
data["chr_factor"] = 1
elif line.startswith("Vehicles"):
try:
data["veh_factor"] = int(line[line.find(":")+1:])
except:
data["veh_factor"] = 1
elif line.startswith("Locations"):
try:
data["loc_factor"] = int(line[line.find(":")+1:])
except:
data["loc_factor"] = 1
elif line.startswith("Objects"):
try:
data["obj_factor"] = int(line[line.find(":")+1:])
except:
data["obj_factor"] = 1
elif line.startswith("Scenes"):
try:
data["rnd_factor"] = int(line[line.find(":")+1:])
except:
data["rnd_factor"] = 1
# Okay this first file was easy. Let's now parse the main checklist and
# get 5 more values. Funny thing is that for the old checklists and new
# checklists you can use the same function to read them. ( The main check-
# list data ). But old checklists had something else in there that was
# making them a bit different from VCStudio checklists. It's the STR and FIN
# variables in the beginig.
# See in the Organizer 1.0 there was no scheduling system as there was in
# Blender-Orgaznier 4.9. The scheduling was done per asset and not per
# action in the checklist. So STR and FIN were 2 dates between which you
# should have had working on the asset.
# But in the main checklists ("project.progress") those 2 survived to the
# late Blender-Organizer as a project startdate and deadline.
# One more rub that I have is that date format was 00/00/0000 and not the
# way better one 0000/00/00 which makes sorting easy. So yeah...
old_date_format = "%d/%m/%Y"
new_date_format = "%Y/%m/%d"
projectdata = open(project_location+"/project.progress")
projectdata = projectdata.read()
projectdata = projectdata.split("\n")
startdate = datetime.datetime.today()
deadline = datetime.datetime.today()
for line in projectdata:
if line.startswith("STR"):
startdate = datetime.datetime.strptime(line[4:], old_date_format)
data["startdate"] = datetime.datetime.strftime(startdate, new_date_format)
elif line.startswith("FIN"):
deadline = datetime.datetime.strptime(line[4:], old_date_format)
data["deadline"] = datetime.datetime.strftime(deadline, new_date_format)
# So we've go the dates. Let's calculate time perventage I guess.
delta = deadline - startdate
data["duration"] = int(delta.days)
delta = datetime.datetime.today() - startdate
data["dayspassed"] = int(delta.days)
data["timepassed"] = data["dayspassed"] / data["duration"]
if data["timepassed"] > 1.0:
data["timepassed"] = 1.0
# Now let's lauch the main checklist and get the data from there. I mean
# the percentage. Btw It's just a hard thing. That I needed a separate
# function for it.
projectdata = checklist.get_list(project_location+"/project.progress")
data["checklist"] = projectdata["fraction"]
# NEXT THING. As I love to type it into place where people read me while I'm
# working. We've got data from 2 files. Now we need to get data from ALL the
# project.
# First we going to get data about the assets. Because it's relativelly easy
# compared to the story. For which you need to parce a crazy complicated .bos
# file. Which is a complex database in it's own right.
# So let's go and quickly get data about the assets.
asstfols = ["chr", "veh", "loc", "obj"]
astlist = []
for n , f in enumerate(asstfols):
flist = []
if len(os.listdir(project_location+"/dev/"+f)) > 0:
for asset in os.listdir(project_location+"/dev/"+f):
if asset+".blend" in os.listdir(project_location+"/ast/"+f):
flist.append(1.0)
else:
try:
fcheck = checklist.get_list(project_location+"/dev/"+f+"/"+asset+"/asset.progress")
flist.append(fcheck["fraction"])
except:
flist.append(0.0)
# The multiplication thing that I was talking about earlier.
multiply = data[f+"_factor"]
for m in range(multiply):
astlist.append(sum(flist)/len(flist))
data[f] = sum(flist)/len(flist)
# For the next step I need to have the story parsed and read. But it's going
# to be so hard. That I will need to write a separate function for it.
data["rnd"] = 0.0
# After all of it we need to get the final project percentage.
multiply = data["rnd_factor"]
for m in range(multiply):
astlist.append(data["rnd"])
try:
data["donework"] = sum(astlist) / len(astlist)
except:
data["donework"] = 0.0
data["fraction"] = (data["donework"] + data["checklist"]) / 2
# Next section of this data gathering will be about history, scheduling and
# similar things. I gonna create a dictionary of dates. And input data about
# those dates into the dates.
return data
this = get_legacy("/home/vcs/Projects/Films/Shorts/MoriasRace")
for i in this:
print(i, " : " ,this[i])