Exemple #1
0
def fill_master_with_glyphs(master_id, user_id, force_update=False):
    session.user = user_id

    load_sqla()
    load_user()

    master = Master.get(id=master_id)
    if not master:
        return False
    put_font_all_glyphs(master, force_update=force_update)

    master.task_completed = True
    web.ctx.orm.commit()
    return True
Exemple #2
0
    def POST(self):
        x = web.input(ufofile={}, project_id=0, label='', glyph='',
                      master_id=0)
        try:
            rawzipcontent = x.ufofile.file.read()
            if not rawzipcontent:
                raise web.badrequest()
            zipcontent = StringIO.StringIO(rawzipcontent)
        except (AttributeError, TypeError, ValueError):
            raise web.badrequest()

        try:
            project_id = int(x.project_id)
        except TypeError:
            project_id = 0

        if not project_id:
            projects = models.Project.all()
            count = projects.filter(models.Project.projectname.like('UntitledProject%')).count()
            project = models.Project.create(projectname='UntitledProject%s' % (count + 1),
                                            mfparser=session.get('mfparser'))
        else:
            project = models.Project.get(id=project_id)
            if not project:
                raise web.notfound()

        master_exists = False
        try:
            master = models.Master.get(id=x.master_id, project_id=project.id)
            master_exists = bool(master)
        except AttributeError:
            master = None

        try:
            fzip = zipfile.ZipFile(zipcontent)

            namelist = fzip.namelist()

            iscorrect_ufo = False
            ufo_dirs = []
            for f in namelist:
                if re.search(r'.ufo[\\/]$', f):
                    ufo_dirs.append(re.sub(r'[\\/]', '', f))
                if re.search(r'.ufo[\\/]glyphs[\\/].*?.glif$', f, re.IGNORECASE):
                    iscorrect_ufo = True

            if not iscorrect_ufo:
                raise web.badrequest()

            FontNameA = ufo_dirs[0]
            name, ext = op.splitext(op.basename(FontNameA))

            if not master:
                master = project.create_master()
                master.name = name
                web.ctx.orm.commit()

            label = get_metapolation_label(x.label)
            metapolation = models.Metapolation.get(label=label, project_id=project.id)
            if not metapolation:
                metapolation = models.Metapolation.create(label=label, project_id=project.id)

            fontpath = project.get_upload_directory()
            fzip.extractall(fontpath)

            ufopath = master.get_ufo_path()
            shutil.move(op.join(fontpath, FontNameA), ufopath)

            prepare_master_environment(master)

            if not master_exists:
                currentglyph = put_font_all_glyphs(master, project.currentglyph,
                                                   preload=True)
                project.currentglyph = currentglyph
            else:
                put_font_all_glyphs(master, project.currentglyph,
                                    preload=True, force_update=True)

            asyncresult = tasks.fill_master_with_glyphs.delay(master.id,
                                                              web.ctx.user.id,
                                                              force_update=master_exists)
            master.task_id = asyncresult.task_id
            master.task_created = datetime.datetime.now()
            web.ctx.orm.commit()
        except (zipfile.BadZipfile, OSError, IOError):
            raise

        master.update_masters_ordering(x.label)
        return ujson.dumps({'project_id': project.id,
                            'glyphname': project.currentglyph,
                            'master_id': master.id,
                            'label': x.label,
                            'metapolation': label})
Exemple #3
0
    def POST(self):
        x = web.input(ufofile={},
                      project_id=0,
                      label='',
                      glyph='',
                      master_id=0)
        try:
            rawzipcontent = x.ufofile.file.read()
            if not rawzipcontent:
                raise web.badrequest()
            zipcontent = StringIO.StringIO(rawzipcontent)
        except (AttributeError, TypeError, ValueError):
            raise web.badrequest()

        try:
            project_id = int(x.project_id)
        except TypeError:
            project_id = 0

        if not project_id:
            projects = models.Project.all()
            count = projects.filter(
                models.Project.projectname.like('UntitledProject%')).count()
            project = models.Project.create(projectname='UntitledProject%s' %
                                            (count + 1),
                                            mfparser=session.get('mfparser'))
        else:
            project = models.Project.get(id=project_id)
            if not project:
                raise web.notfound()

        master_exists = False
        try:
            master = models.Master.get(id=x.master_id, project_id=project.id)
            master_exists = bool(master)
        except AttributeError:
            master = None

        try:
            fzip = zipfile.ZipFile(zipcontent)

            namelist = fzip.namelist()

            iscorrect_ufo = False
            ufo_dirs = []
            for f in namelist:
                if re.search(r'.ufo[\\/]$', f):
                    ufo_dirs.append(re.sub(r'[\\/]', '', f))
                if re.search(r'.ufo[\\/]glyphs[\\/].*?.glif$', f,
                             re.IGNORECASE):
                    iscorrect_ufo = True

            if not iscorrect_ufo:
                raise web.badrequest()

            FontNameA = ufo_dirs[0]
            name, ext = op.splitext(op.basename(FontNameA))

            if not master:
                master = project.create_master()
                master.name = name
                web.ctx.orm.commit()

            label = get_metapolation_label(x.label)
            metapolation = models.Metapolation.get(label=label,
                                                   project_id=project.id)
            if not metapolation:
                metapolation = models.Metapolation.create(
                    label=label, project_id=project.id)

            fontpath = project.get_upload_directory()
            fzip.extractall(fontpath)

            ufopath = master.get_ufo_path()
            shutil.move(op.join(fontpath, FontNameA), ufopath)

            prepare_master_environment(master)

            if not master_exists:
                currentglyph = put_font_all_glyphs(master,
                                                   project.currentglyph,
                                                   preload=True)
                project.currentglyph = currentglyph
            else:
                put_font_all_glyphs(master,
                                    project.currentglyph,
                                    preload=True,
                                    force_update=True)

            asyncresult = tasks.fill_master_with_glyphs.delay(
                master.id, web.ctx.user.id, force_update=master_exists)
            master.task_id = asyncresult.task_id
            master.task_created = datetime.datetime.now()
            web.ctx.orm.commit()
        except (zipfile.BadZipfile, OSError, IOError):
            raise

        master.update_masters_ordering(x.label)
        return ujson.dumps({
            'project_id': project.id,
            'glyphname': project.currentglyph,
            'master_id': master.id,
            'label': x.label,
            'metapolation': label
        })