Ejemplo n.º 1
0
    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")
Ejemplo n.º 2
0
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)