[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