def create(self, request, name=None, version=None): ''' POST method for the Package resource. Takes data from a POST petition, deserializes it and saves it into the database model. ''' base = Package.objects sectionbase = Section.objects languagesbase = Languages.objects supportedbase = Supported.objects # In this properties list, every m2m relationship is not yet developed. propertieslist = ['name', 'version', 'architecture', 'short_description', 'long_description', 'installed_size', 'maintainer', 'creator', 'publisher', 'rights_holder', 'filename', 'release_date', 'changes', 'size', 'license', 'sha256', 'homepage', 'languages', 'supported', 'section', 'replaces', 'pre_depends', 'depends', 'provides', 'recommends', 'suggests'] # Using wpkg parser pkg = PackageParser() pkg.from_string(request.raw_post_data) packagemodel = Package() if pkg: #Here I match each property from Package to the model properties. # Important note: After every mandatory field is set, the package is saved into # the database in order to create the m2m relations for prop in propertieslist: if prop == 'section': try: sectionexist = sectionbase.get(title=pkg.get_property(prop)) except: sectionexist = None packagemodel.delete() return HttpResponse("Section doesnt exist "+pkg.get_property(prop)) #RISE ERROR if sectionexist: # Here there is a nasty solution. Section is the last added element # and the package should be saved before adding it to the set. # Pending for a better solution. packagemodel.save() sectionexist.package_set.add(packagemodel) elif prop == 'maintainer' or prop == 'creator'or prop == 'publisher' or prop == 'rights_holder': # Here we split name and email. rex = re.compile('(?P<name>[^"]*) "(?P<email>[^"]*)') exrex = rex.match(pkg.get_property(prop)) if exrex: setattr(packagemodel, prop+"_email", exrex.group('email')) setattr(packagemodel, prop, exrex.group('name')) else: packagemodel.delete() return HttpResponse("Invalid name and email format in: "+prop) elif prop == 'release_date': ds = pkg.get_property(prop).split('/') dateobject = datetime.date(year=int(ds[2]), month=int(ds[1]), day=int(ds[0])) setattr(packagemodel, prop, dateobject) elif prop == 'languages': for language in pkg.get_property(prop): try: languageexist = languagesbase.get(language=language) except: packagemodel.delete() return HttpResponse("Language doesn't exist") packagemodel.save() packagemodel.languages.add(languageexist) elif prop == 'supported': for supported in pkg.get_property(prop): try: supportedexist = supportedbase.get(os_version=supported) except: packagemodel.delete() return HttpResponse("Windows version doesn't exist:"+supported) packagemodel.save() packagemodel.supported.add(supportedexist) elif prop == 'replaces' or prop == 'pre_depends' or prop == 'depends' or prop == 'provides' or prop == 'recommends' or prop == 'suggests': for item in pkg.get_property(prop): if item: rex = re.compile('(?P<name>[^"]*) \((?P<version>[^\)]*)') exrex = rex.match(item) try: packageexist = base.get(name=exrex.group('name'), version=exrex.group('version')) except: packagemodel.delete() return HttpResponse("Package not found: "+exrex.group('name')+" in "+prop) else: break tmpprop = getattr(packagemodel, prop) tmpprop.add(packageexist) else: setattr(packagemodel, prop, pkg.get_property(prop)) packagemodel.save() return rc.CREATED else: #RISE ERROR return HttpResponse("There is nothing")
def main(argv): """ Main function of execution """ opts, args = parse(argv) # Setup logging logging.basicConfig(level=opts.verbose, format=LOG_FORMAT, datefmt=DATE) # Change dir if necessary if opts.folder: if not os.path.exists(opts.folder): logging.info('Creating non-existant directory: %s' % opts.folder) os.mkdir(opts.folder) os.chdir(opts.folder) # Start parsing arguments if len(args) == 0: # try: if 1: import frontend app = frontend.CreatorApp(0) app.MainLoop() return elif args[0].lower() == 'init': lib.init(opts.overwrite) sys.exit() elif len(args) < 2 or (args[0] == 'set' and len(args) < 3): parse(['--help']) # Parse e = Package() if os.path.exists(wpkg.package.INFO_FILENAME): try: e.from_file(wpkg.package.INFO_FILENAME) except: pass else: print os.getcwd() raise IOError, 'info.xml does not exist' # Convert parameters to variable names args[1] = args[1].replace('-','_') args[0] = args[0].lower() for i in range(0,len(args)): args[i] = args[i].replace('\\n','\n') # Set the values if args[0] == 'show': x = e.get_property(args[1])#.to_string() if isinstance(x, List): # Received a list if x == []: print None else: print x else: # Just a string print x elif args[0] == 'clear': if isinstance(e.get_property(args[1]), List): e.set_property(args[1], []) else: e.set_property(args[1], '') e.write() elif args[0] == 'set': x = e.get_property(args[1])#.to_string() if isinstance(x, PackageList): x.clear() for package in ''.join(args[2:]).split(';'): name, version = package.split(',') pkg = PackageShort(name, version) x.append(pkg) elif isinstance(e.get_property(args[1]), List): e.set_property(args[1], args[2:]) else: e.set_property(args[1], ' '.join(args[2:])) e.write() # Write the package info.xml file elif args[0] == 'append': e.append_property(args[1], args[2:]) e.write() elif args[0] == 'script': lib.set_script(args[1], args[2], opts.overwrite)