def wrapTask(request, action): # Allow only post if request.method != 'POST': raise Exception('Only post requests allowed') # Parse the posted parameters as arguments for an asynchronous task to add to the queue. TODO MAKE MODULAR WITH SEPERATE TASK CLASS worker_database = request.database now = datetime.now() task = None args = request.POST or request.GET # A if action in ('frepple_run', 'runplan'): if not request.user.has_perm('auth.generate_plan'): raise Exception('Missing execution privileges') constraint = 0 for value in args.getlist('constraint'): try: constraint += int(value) except: pass task = Task(name='runplan', submitted=now, status='Waiting', user=request.user) task.arguments = "--constraint=%s --plantype=%s" % ( constraint, args.get('plantype', 1)) env = [] for value in args.getlist('env'): env.append(value) if env: task.arguments = "%s --env=%s" % (task.arguments, ','.join(env)) request.session['env'] = env task.save(using=request.database) # Update the session object request.session['plantype'] = args.get('plantype') request.session['constraint'] = constraint # C elif action in ('frepple_flush', 'empty'): if not request.user.has_perm('auth.run_db'): raise Exception('Missing execution privileges') task = Task(name='empty', submitted=now, status='Waiting', user=request.user) models = ','.join(args.getlist('models')) if models: task.arguments = "--models=%s" % (models) task.save(using=request.database) # D elif action == 'loaddata': if not request.user.has_perm('auth.run_db'): raise Exception('Missing execution privileges') task = Task(name='loaddata', submitted=now, status='Waiting', user=request.user, arguments=args['fixture']) task.save(using=request.database) # E elif action in ('frepple_copy', 'scenario_copy'): worker_database = DEFAULT_DB_ALIAS if 'copy' in args: if not request.user.has_perm('auth.copy_scenario'): raise Exception('Missing execution privileges') source = args.get('source', DEFAULT_DB_ALIAS) worker_database = source destination = args.getlist('destination') force = args.get('force', False) for sc in Scenario.objects.all(): arguments = "%s %s" % (source, sc.name) if force: arguments += ' --force' if args.get(sc.name, 'off') == 'on' or sc.name in destination: task = Task(name='scenario_copy', submitted=now, status='Waiting', user=request.user, arguments=arguments) task.save(using=source) elif 'release' in args: # Note: release is immediate and synchronous. if not request.user.has_perm('auth.release_scenario'): raise Exception('Missing execution privileges') for sc in Scenario.objects.all().using(DEFAULT_DB_ALIAS): if args.get(sc.name, 'off') == 'on' and sc.status != 'Free': sc.status = 'Free' sc.lastrefresh = now sc.save(using=DEFAULT_DB_ALIAS) if request.database == sc.name: # Erasing the database that is currently selected. request.prefix = '' elif 'update' in args: # Note: update is immediate and synchronous. if not request.user.has_perm('auth.release_scenario'): raise Exception('Missing execution privileges') for sc in Scenario.objects.all().using(DEFAULT_DB_ALIAS): if args.get(sc.name, 'off') == 'on': sc.description = args.get('description', None) sc.save(using=DEFAULT_DB_ALIAS) else: raise Exception('Invalid scenario task') # G elif action in ('frepple_createbuckets', 'createbuckets'): if not request.user.has_perm('auth.run_db'): raise Exception('Missing execution privileges') task = Task(name='createbuckets', submitted=now, status='Waiting', user=request.user) arguments = [] start = args.get('start', None) if start: arguments.append("--start=%s" % start) end = args.get('end', None) if end: arguments.append("--end=%s" % end) weekstart = args.get('weekstart', None) if weekstart: arguments.append("--weekstart=%s" % weekstart) if arguments: task.arguments = " ".join(arguments) task.save(using=request.database) else: # Generic task wrapper # Find the command and verify we have permissions to run it command = None for commandname, appname in get_commands().items(): if commandname == action: try: c = getattr( import_module('%s.management.commands.%s' % (appname, commandname)), 'Command') if c.index >= 0: if getattr(c, 'getHTML', None) and c.getHTML(request): # Command class has getHTML method command = c break else: for p in c.__bases__: # Parent command class has getHTML method if getattr(p, 'getHTML', None) and p.getHTML(request): command = c break if command: break except Exception: pass # Silently ignore failures if not command: raise Exception("Invalid task name '%s'" % action) # Create a task arguments = [] for arg, val in args.lists(): if arg != 'csrfmiddlewaretoken': arguments.append('--%s=%s' % (arg, ','.join(val))) task = Task(name=action, submitted=now, status='Waiting', user=request.user) if arguments: task.arguments = " ".join(arguments) task.save(using=request.database) # Launch a worker process, making sure it inherits the right # environment variables from this parent os.environ['FREPPLE_CONFIGDIR'] = settings.FREPPLE_CONFIGDIR if task and not checkActive(worker_database): if os.path.isfile(os.path.join(settings.FREPPLE_APP, "frepplectl.py")): if "python" in sys.executable: # Development layout Popen([ sys.executable, # Python executable os.path.join(settings.FREPPLE_APP, "frepplectl.py"), "runworker", "--database=%s" % worker_database ]) else: # Deployment on Apache web server Popen([ "python", os.path.join(settings.FREPPLE_APP, "frepplectl.py"), "runworker", "--database=%s" % worker_database ], creationflags=0x08000000) elif sys.executable.find('freppleserver.exe') >= 0: # Py2exe executable Popen( [ sys.executable.replace( 'freppleserver.exe', 'frepplectl.exe'), # frepplectl executable "runworker", "--database=%s" % worker_database ], creationflags=0x08000000) # Do not create a console window else: # Linux standard installation Popen( ["frepplectl", "runworker", "--database=%s" % worker_database]) return task
def wrapTask(request, action): # Allow only post if request.method != "POST": raise Exception("Only post requests allowed") # Parse the posted parameters as arguments for an asynchronous task to add to the queue. TODO MAKE MODULAR WITH SEPERATE TASK CLASS worker_database = request.database now = datetime.now() task = None args = request.POST or request.GET # A if action in ("frepple_run", "runplan"): if not request.user.has_perm("auth.generate_plan"): raise Exception("Missing execution privileges") constraint = 0 for value in args.getlist("constraint"): try: constraint += int(value) except Exception: pass task = Task(name="runplan", submitted=now, status="Waiting", user=request.user) task.arguments = "--constraint=%s --plantype=%s" % ( constraint, args.get("plantype", 1), ) env = [] for value in args.getlist("env"): env.append(value) if env: task.arguments = "%s --env=%s" % (task.arguments, ",".join(env)) task.save(using=request.database) # C elif action in ("frepple_flush", "empty"): if not request.user.has_perm("auth.run_db"): raise Exception("Missing execution privileges") task = Task(name="empty", submitted=now, status="Waiting", user=request.user) models = ",".join(args.getlist("models")) if models: task.arguments = "--models=%s" % (models) task.save(using=request.database) # D elif action == "loaddata": if not request.user.has_perm("auth.run_db"): raise Exception("Missing execution privileges") task = Task( name="loaddata", submitted=now, status="Waiting", user=request.user, arguments=args["fixture"], ) task.save(using=request.database) # Also run the workflow upon loading of manufacturing_demo or distribution_demo if args.get("regenerateplan", False) == "true": active_modules = "supply" task = Task(name="runplan", submitted=now, status="Waiting", user=request.user) task.arguments = "--constraint=15 --plantype=1 --env=%s --background" % ( active_modules, ) task.save(using=request.database) # E elif action in ("frepple_copy", "scenario_copy"): worker_database = DEFAULT_DB_ALIAS if "copy" in args: if not request.user.has_perm("auth.copy_scenario"): raise Exception("Missing execution privileges") source = args.get("source", request.database) worker_database = source destination = args.get("destination", False) if destination and destination != DEFAULT_DB_ALIAS: force = args.get("force", False) arguments = "%s %s" % (source, destination) if force: arguments += " --force" task = Task( name="scenario_copy", submitted=now, status="Waiting", user=request.user, arguments=arguments, ) task.save(using=source) elif "release" in args: # Note: release is immediate and synchronous. if not request.user.has_perm("auth.release_scenario"): raise Exception("Missing execution privileges") sc = Scenario.objects.using(DEFAULT_DB_ALIAS).get( name=request.database) if sc.status != "Free" and sc.name != DEFAULT_DB_ALIAS: sc.status = "Free" sc.lastrefresh = now sc.save(using=DEFAULT_DB_ALIAS) elif "promote" in args: if not request.user.has_perm("auth.promote_scenario"): raise Exception("Missing execution privileges") source = args.get("source", request.database) worker_database = source destination = args.get("destination", False) if destination and destination == DEFAULT_DB_ALIAS: arguments = "--promote %s %s" % (source, destination) task = Task( name="scenario_copy", submitted=now, status="Waiting", user=request.user, arguments=arguments, ) task.save(using=source) elif "update" in args: # Note: update is immediate and synchronous. if not request.user.has_perm("auth.release_scenario"): raise Exception("Missing execution privileges") sc = Scenario.objects.using(DEFAULT_DB_ALIAS).get( name=request.database) sc.description = args.get("description", None) sc.save(using=DEFAULT_DB_ALIAS) else: raise Exception("Invalid scenario task") # G elif action in ("frepple_createbuckets", "createbuckets"): if not request.user.has_perm("auth.run_db"): raise Exception("Missing execution privileges") task = Task(name="createbuckets", submitted=now, status="Waiting", user=request.user) arguments = [] start = args.get("start", None) if start: arguments.append("--start=%s" % start) end = args.get("end", None) if end: arguments.append("--end=%s" % end) weekstart = args.get("weekstart", None) if weekstart: arguments.append("--weekstart=%s" % weekstart) format_day = args.get("format-day", None) if format_day: arguments.append('--format-day="%s"' % format_day) format_week = args.get("format-week", None) if format_week: arguments.append('--format-week="%s"' % format_week) format_month = args.get("format-month", None) if format_month: arguments.append('--format-month="%s"' % format_month) format_quarter = args.get("format-quarter", None) if format_quarter: arguments.append('--format-quarter="%s"' % format_quarter) format_year = args.get("format-year", None) if format_year: arguments.append('--format-year="%s"' % format_year) if arguments: task.arguments = " ".join(arguments) task.save(using=request.database) else: # Generic task wrapper # Find the command and verify we have permissions to run it command = None for commandname, appname in get_commands().items(): if commandname == action: try: c = getattr( import_module("%s.management.commands.%s" % (appname, commandname)), "Command", ) if c.index >= 0: if getattr(c, "getHTML", None) and c.getHTML(request): # Command class has getHTML method command = c break else: for p in c.__bases__: # Parent command class has getHTML method if getattr(p, "getHTML", None) and p.getHTML(request): command = c break if command: break except Exception: pass # Silently ignore failures if not command: raise Exception("Invalid task name '%s'" % action) # Create a task arguments = [] for arg, val in args.lists(): if arg != "csrfmiddlewaretoken": arguments.append("--%s=%s" % (arg, ",".join(val))) task = Task(name=action, submitted=now, status="Waiting", user=request.user) if arguments: task.arguments = " ".join(arguments) task.save(using=request.database) # Launch a worker process, making sure it inherits the right # environment variables from this parent os.environ["FREPPLE_CONFIGDIR"] = settings.FREPPLE_CONFIGDIR if task and not checkActive(worker_database): if os.path.isfile(os.path.join(settings.FREPPLE_APP, "frepplectl.py")): if "python" in sys.executable: # Development layout Popen([ sys.executable, # Python executable os.path.join(settings.FREPPLE_APP, "frepplectl.py"), "runworker", "--database=%s" % worker_database, ]) else: # Deployment on Apache web server Popen( [ "python", os.path.join(settings.FREPPLE_APP, "frepplectl.py"), "runworker", "--database=%s" % worker_database, ], creationflags=0x08000000, ) elif sys.executable.find("freppleserver.exe") >= 0: # Py2exe executable Popen( [ sys.executable.replace( "freppleserver.exe", "frepplectl.exe"), # frepplectl executable "runworker", "--database=%s" % worker_database, ], creationflags=0x08000000, ) # Do not create a console window else: # Linux standard installation Popen( ["frepplectl", "runworker", "--database=%s" % worker_database]) return task
def wrapTask(request, action): # Allow only post if request.method != 'POST': raise Exception('Only post requests allowed') # Parse the posted parameters as arguments for an asynchronous task to add to the queue. TODO MAKE MODULAR WITH SEPERATE TASK CLASS worker_database = request.database now = datetime.now() task = None args = request.POST or request.GET # A if action in ('frepple_run', 'runplan'): if not request.user.has_perm('auth.generate_plan'): raise Exception('Missing execution privileges') constraint = 0 for value in args.getlist('constraint'): try: constraint += int(value) except: pass task = Task(name='runplan', submitted=now, status='Waiting', user=request.user) task.arguments = "--constraint=%s --plantype=%s" % (constraint, args.get('plantype', 1)) env = [] for value in args.getlist('env'): env.append(value) if env: task.arguments = "%s --env=%s" % (task.arguments, ','.join(env)) task.save(using=request.database) # C elif action in ('frepple_flush', 'empty'): if not request.user.has_perm('auth.run_db'): raise Exception('Missing execution privileges') task = Task(name='empty', submitted=now, status='Waiting', user=request.user) models = ','.join(args.getlist('models')) if models: task.arguments = "--models=%s" % (models) task.save(using=request.database) # D elif action == 'loaddata': if not request.user.has_perm('auth.run_db'): raise Exception('Missing execution privileges') task = Task(name='loaddata', submitted=now, status='Waiting', user=request.user, arguments=args['fixture']) task.save(using=request.database) # Also run the workflow upon loading of manufacturing_demo or distribution_demo if (args['regenerateplan'] == 'true'): active_modules = 'supply' task = Task(name='runplan', submitted=now, status='Waiting', user=request.user) task.arguments = "--constraint=15 --plantype=1 --env=%s --background" % (active_modules,) task.save(using=request.database) # E elif action in ('frepple_copy', 'scenario_copy'): worker_database = DEFAULT_DB_ALIAS if 'copy' in args: if not request.user.has_perm('auth.copy_scenario'): raise Exception('Missing execution privileges') source = args.get('source', DEFAULT_DB_ALIAS) worker_database = source destination = args.getlist('destination') force = args.get('force', False) for sc in Scenario.objects.using(DEFAULT_DB_ALIAS): arguments = "%s %s" % (source, sc.name) if force: arguments += ' --force' if args.get(sc.name, 'off') == 'on' or sc.name in destination: task = Task(name='scenario_copy', submitted=now, status='Waiting', user=request.user, arguments=arguments) task.save(using=source) elif 'release' in args: # Note: release is immediate and synchronous. if not request.user.has_perm('auth.release_scenario'): raise Exception('Missing execution privileges') for sc in Scenario.objects.using(DEFAULT_DB_ALIAS): if args.get(sc.name, 'off') == 'on' and sc.status != 'Free': sc.status = 'Free' sc.lastrefresh = now sc.save(using=DEFAULT_DB_ALIAS) if request.database == sc.name: # Erasing the database that is currently selected. request.prefix = '' elif 'update' in args: # Note: update is immediate and synchronous. if not request.user.has_perm('auth.release_scenario'): raise Exception('Missing execution privileges') for sc in Scenario.objects.using(DEFAULT_DB_ALIAS): if args.get(sc.name, 'off') == 'on': sc.description = args.get('description', None) sc.save(using=DEFAULT_DB_ALIAS) else: raise Exception('Invalid scenario task') # G elif action in ('frepple_createbuckets', 'createbuckets'): if not request.user.has_perm('auth.run_db'): raise Exception('Missing execution privileges') task = Task(name='createbuckets', submitted=now, status='Waiting', user=request.user) arguments = [] start = args.get('start', None) if start: arguments.append("--start=%s" % start) end = args.get('end', None) if end: arguments.append("--end=%s" % end) weekstart = args.get('weekstart', None) if weekstart: arguments.append("--weekstart=%s" % weekstart) format_day = args.get('format-day', None) if format_day: arguments.append('--format-day="%s"' % format_day) format_week = args.get('format-week', None) if format_week: arguments.append('--format-week="%s"' % format_week) format_month = args.get('format-month', None) if format_month: arguments.append('--format-month="%s"' % format_month) format_quarter = args.get('format-quarter', None) if format_quarter: arguments.append('--format-quarter="%s"' % format_quarter) format_year = args.get('format-year', None) if format_year: arguments.append('--format-year="%s"' % format_year) if arguments: task.arguments = " ".join(arguments) task.save(using=request.database) else: # Generic task wrapper # Find the command and verify we have permissions to run it command = None for commandname, appname in get_commands().items(): if commandname == action: try: c = getattr(import_module('%s.management.commands.%s' % (appname, commandname)), 'Command') if c.index >= 0: if getattr(c, 'getHTML', None) and c.getHTML(request): # Command class has getHTML method command = c break else: for p in c.__bases__: # Parent command class has getHTML method if getattr(p, 'getHTML', None) and p.getHTML(request): command = c break if command: break except Exception: pass # Silently ignore failures if not command: raise Exception("Invalid task name '%s'" % action) # Create a task arguments = [] for arg, val in args.lists(): if arg != 'csrfmiddlewaretoken': arguments.append('--%s=%s' % (arg, ','.join(val))) task = Task(name=action, submitted=now, status='Waiting', user=request.user) if arguments: task.arguments = " ".join(arguments) task.save(using=request.database) # Launch a worker process, making sure it inherits the right # environment variables from this parent os.environ['FREPPLE_CONFIGDIR'] = settings.FREPPLE_CONFIGDIR if task and not checkActive(worker_database): if os.path.isfile(os.path.join(settings.FREPPLE_APP, "frepplectl.py")): if "python" in sys.executable: # Development layout Popen([ sys.executable, # Python executable os.path.join(settings.FREPPLE_APP, "frepplectl.py"), "runworker", "--database=%s" % worker_database ]) else: # Deployment on Apache web server Popen([ "python", os.path.join(settings.FREPPLE_APP, "frepplectl.py"), "runworker", "--database=%s" % worker_database ], creationflags=0x08000000) elif sys.executable.find('freppleserver.exe') >= 0: # Py2exe executable Popen([ sys.executable.replace('freppleserver.exe', 'frepplectl.exe'), # frepplectl executable "runworker", "--database=%s" % worker_database ], creationflags=0x08000000) # Do not create a console window else: # Linux standard installation Popen([ "frepplectl", "runworker", "--database=%s" % worker_database ]) return task