[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [3596] trunk/py/scripts/addons/ render_renderfarmfi.py: Use user config dir to save credentials.
Nathan Letwory
nathan at letworyinteractive.com
Mon Jul 9 09:25:46 CEST 2012
Revision: 3596
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=3596
Author: jesterking
Date: 2012-07-09 07:25:46 +0000 (Mon, 09 Jul 2012)
Log Message:
-----------
Use user config dir to save credentials.
After successful login switching to Renderfarm.fi
renderer will automatically log in with existing
credentials.
Note that no password is saved.
Modified Paths:
--------------
trunk/py/scripts/addons/render_renderfarmfi.py
Modified: trunk/py/scripts/addons/render_renderfarmfi.py
===================================================================
--- trunk/py/scripts/addons/render_renderfarmfi.py 2012-07-08 12:37:52 UTC (rev 3595)
+++ trunk/py/scripts/addons/render_renderfarmfi.py 2012-07-09 07:25:46 UTC (rev 3596)
@@ -21,12 +21,12 @@
bl_info = {
"name": "Renderfarm.fi",
"author": "Nathan Letwory <nathan at letworyinteractive.com>, Jesse Kaukonen <jesse.kaukonen at gmail.com>",
- "version": (20,),
- "blender": (2, 6, 2),
+ "version": (21,),
+ "blender": (2, 6, 3),
"location": "Render > Engine > Renderfarm.fi",
"description": "Send .blend as session to http://www.renderfarm.fi to render",
"warning": "",
- "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.6/Py/"\
+ "wiki_url": "http://wiki.blender.org/index.php/Extensions:2.5/Py/"\
"Scripts/Render/Renderfarm.fi",
"tracker_url": "https://projects.blender.org/tracker/index.php?"\
"func=detail&aid=22927",
@@ -42,9 +42,10 @@
import http.client
import xmlrpc.client
import math
-from os.path import isabs, isfile
+from os.path import isabs, isfile, join, exists
import os
import time
+import imp
from bpy.props import PointerProperty, StringProperty, BoolProperty, EnumProperty, IntProperty, CollectionProperty
@@ -53,6 +54,12 @@
bpy.up_to_date = False
bpy.download_location = 'http://www.renderfarm.fi/blender'
+bpy.rffi_creds_found = False
+bpy.rffi_user = ''
+bpy.rffi_hash = ''
+bpy.passwordCorrect = False
+bpy.loginInserted = False
+
bpy.errorMessages = {
'missing_desc': 'You need to enter a title, short and long description',
'missing_creds': 'You haven\'t entered your credentials yet'
@@ -118,7 +125,6 @@
class ORESettings(bpy.types.PropertyGroup):
username = StringProperty(name='E-mail', description='E-mail for Renderfarm.fi', maxlen=256, default='')
password = StringProperty(name='Password', description='Renderfarm.fi password', maxlen=256, default='')
- hash = StringProperty(name='Hash', description='hash calculated out of credentials', maxlen=33, default='')
shortdesc = StringProperty(name='Short description', description='A short description of the scene (100 characters)', maxlen=101, default='-')
tags = StringProperty(name='Tags', description='A list of tags that best suit the animation', maxlen=102, default='')
@@ -139,8 +145,6 @@
fps = IntProperty(name='FPS', description='FPS', min=1, max=120, default=25)
prepared = BoolProperty(name='Prepared', description='Set to True if preparation has been run', default=False)
- loginInserted = BoolProperty(name='LoginInserted', description='Set to True if user has logged in', default=False)
- passwordCorrect = BoolProperty(name='PasswordCorrect', description='Set to False if the password is incorrect', default=True)
debug = BoolProperty(name='Debug', description='Verbose output in console', default=False)
selected_session = IntProperty(name='Selected Session', description='The selected session', default=0)
hasUnsupportedSimulation = BoolProperty(name='HasSimulation', description='Set to True if therea re unsupported simulations', default=False)
@@ -447,7 +451,7 @@
layout = self.layout
ore = context.scene.ore_render
- if (ore.loginInserted == True):
+ if (bpy.loginInserted == True):
layout.operator('ore.completed_sessions')
layout.operator('ore.accept_sessions')
layout.operator('ore.active_sessions')
@@ -467,21 +471,28 @@
return (rd.use_game_engine==False) and (rd.engine in cls.COMPAT_ENGINES)
def draw(self, context):
+
+ # login
+ if not bpy.loginInserted:
+ print("trying to log in in draw()")
+ if _login(None, False, True):
+ bpy.passwordCorrect = True
+ bpy.loginInserted = True
+
layout = self.layout
ore = context.scene.ore_render
checkStatus(ore)
- if (ore.passwordCorrect == False):
+ if bpy.passwordCorrect == False:
row = layout.row()
row.label(text="Email or password missing/incorrect", icon='ERROR')
- if ore.hash=='':
col = layout.column()
- if ore.hash=='':
- col.prop(ore, 'username', icon=bpy.statusMessage['username'])
- col.prop(ore, 'password', icon=bpy.statusMessage['password'])
+ col.prop(ore, 'username', icon=bpy.statusMessage['username'])
+ col.prop(ore, 'password', icon=bpy.statusMessage['password'])
layout.operator('ore.login')
else:
- layout.label(text='Successfully logged in', icon='INFO')
+ layout.label(text='Successfully logged in as:', icon='INFO')
+ layout.label(text=bpy.rffi_user)
layout.operator('ore.change_user')
class SESSIONS_PT_RenderfarmFi(RenderButtonsPanel, bpy.types.Panel):
@@ -495,7 +506,7 @@
def draw(self, context):
ore = context.scene.ore_render
- if (ore.passwordCorrect == True and ore.loginInserted == True):
+ if (bpy.passwordCorrect == True and bpy.loginInserted == True):
layout = self.layout
layout.template_list(ore, 'all_sessions', ore, 'selected_session', rows=5)
@@ -526,7 +537,7 @@
ore = sce.ore_render
rd = sce.render
- if (ore.passwordCorrect == False or ore.loginInserted == False):
+ if (bpy.passwordCorrect == False or bpy.loginInserted == False):
layout.label(text='You must login first')
else:
layout.prop(ore, 'title', icon=bpy.statusMessage['title'])
@@ -603,7 +614,7 @@
sce = context.scene
ore = sce.ore_render
rd = sce.render
- if (ore.passwordCorrect == False or ore.loginInserted == False):
+ if (bpy.passwordCorrect == False or bpy.loginInserted == False):
layout.label(text="You must login first")
else:
if (bpy.ready):
@@ -765,14 +776,12 @@
bpy.context.scene.render.engine = 'RENDERFARMFI_RENDER'
return {'CANCELLED'}
try:
- print("Creating auth proxy")
- authproxy = xmlrpc.client.ServerProxy(rffi_xmlrpc_secure, verbose=DEV)
- print("Getting session key")
- res = authproxy.auth.getSessionKey(ore.username, ore.hash)
+ _read_credentials()
+ res = _login(op, True)
key = res['key']
userid = res['userId']
print("Creating server proxy")
- proxy = xmlrpc.client.ServerProxy(rffi_xmlrpc, verbose=DEV) #r'http://xmlrpc.renderfarm.fi/session')
+ proxy = xmlrpc.client.ServerProxy(rffi_xmlrpc, verbose=DEV)
proxy._ServerProxy__transport.user_agent = 'Renderfarm.fi Uploader/%s' % (bpy.CURRENT_VERSION)
print("Creating a new session")
res = proxy.session.createSession(userid, key) # This may use an existing, non-rendered session. Prevents spamming in case the upload fails for some reason
@@ -836,19 +845,58 @@
if bpy.statusMessage[property] == 'ERROR':
layoutform.label(text='', icon='ERROR')
+def _write_credentials(hash, user):
+ with open(join(bpy.utils.user_resource('CONFIG', 'rffi', True), 'rffi_credentials.py'), 'w') as pwfile:
+ pwfile.write('hash=\''+hash+'\'\n')
+ pwfile.write('user=\''+user+'\'')
+
+def _read_credentials():
+ bpy.rffi_creds_found = False
+ bpy.rffi_user = ''
+ bpy.rffi_hash = ''
+
+ pwfile = bpy.utils.user_resource('CONFIG', 'rffi', True)
+ try:
+ pwmod = imp.find_module('rffi_credentials',[pwfile])
+ except ImportError as e:
+ _write_credentials('', '')
+ pwmod = imp.find_module('rffi_credentials',[pwfile])
+ try:
+ user_creds = imp.load_module('rffi_credentials', pwmod[0], pwmod[1], pwmod[2])
+ bpy.rffi_user = user_creds.user
+ bpy.rffi_hash = user_creds.hash
+ bpy.rffi_creds_found = True
+ except ImportError as e:
+ # doesn't exist yet, write template
+ _write_credentials('', '')
+ pwfile = bpy.utils.user_resource('CONFIG', 'rffi', True)
+ pwmod = imp.find_module('rffi_credentials',[pwfile])
+ try:
+ user_creds = imp.load_module('rffi_credentials', pwmod[0], pwmod[1], pwmod[2])
+ bpy.rffi_user = user_creds.user
+ bpy.rffi_hash = user_creds.hash
+ bpy.rffi_creds_found = True
+ except Exception as e2:
+ print("Couldn't write rffi_credentials.py", e2)
+ finally:
+ if pwmod[0]: pwmod[0].close()
+
+ return bpy.rffi_creds_found
+
+
def checkStatus(ore):
bpy.errors = []
- if ore.hash=='' and (ore.username=='' or ore.password==''):
+ if bpy.rffi_creds_found == False and bpy.rffi_hash == '':
bpy.errors.append('missing_creds')
if '' in {ore.title, ore.longdesc, ore.shortdesc}:
bpy.errors.append('missing_desc')
bpy.infoError = True
+
+ setStatus('username', bpy.rffi_hash=='' and ore.username=='')
+ setStatus('password', bpy.rffi_hash=='' and ore.password=='')
- setStatus('username', ore.hash=='' and ore.username=='')
- setStatus('password', ore.hash=='' and ore.password=='')
-
setStatus('title', ore.title=='')
setStatus('longdesc', ore.longdesc=='')
setStatus('shortdesc', ore.shortdesc=='')
@@ -874,13 +922,12 @@
done = 100
return done
-def xmlSessionsToOreSessions(sessions, stage=None): #, queue):
+def xmlSessionsToOreSessions(sessions, stage=None):
output = []
for session in sessions:
s = session['title']
if stage:
s = s + ' (' + stage + ')'
- #t = session['timestamps']
sinfo = OreSession(session['sessionId'], s)
if stage in {'Completed', 'Active'}:
sinfo.frames = session['framesRendered']
@@ -889,49 +936,76 @@
output.append(sinfo)
return output
-def doRefresh(op, rethrow=False):
+def _login(op, rethrow=False, print_errors=True):
+ res = None
+ if _read_credentials():
+ try:
+ print("credentials read, refreshing")
+ proxy = xmlrpc.client.ServerProxy(rffi_xmlrpc_secure, verbose=DEV)
+ res = proxy.auth.getSessionKey(bpy.rffi_user, bpy.rffi_hash)
+ except xmlrpc.client.Error as v:
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list