def import_slevels(self, slevelfiles): """Import skilllevels from skillleveltable_characterx.dnt to django models.""" # Ugly and inefficient # Should avoid loading all slevels into memory before parsing rows = [] for f in slevelfiles: slevelfile = DNTFile(f) log.info('import_slevels\tfile\t%s' % slevelfile.filename) slevelfile.read_all() log.info('import_slevels\tParsed DNT File') rows.extend(slevelfile.rows) desc_re = re.compile(r'\{(\d+)\}') repl = lambda m: self._uistring[int(m.group(1))] # sort the rows so it goes 1-pve, 1-pvp, 2-pve, 2-pvp... rows.sort(key=lambda x: (x.SkillLevel, x.id)) for oldid, newid in self._skillmap.iteritems(): skill = Skill.objects.filter(id=newid).get() flt = lambda x: x.SkillIndex == oldid and x.SkillLevel <= 100 slevels = filter(flt, rows) if len(slevels) < 2 or len(slevels) % 2 != 0: continue skill.description = self._uistring[slevels[0].SkillExplanationID] skill.save(update_fields=['description']) sp_cumulative = 0 for pve, pvp in zip(slevels[::2], slevels[1::2]): pve_params = desc_re.sub(repl, pve.SkillExplanationIDParam) pvp_params = desc_re.sub(repl, pvp.SkillExplanationIDParam) sp_cumulative += pve.NeedSkillPoint assert pve.SkillLevel == pvp.SkillLevel, 'Slevel ordering error' slevel = SkillLevel( level=pve.SkillLevel, description_params_pve=pve_params, description_params_pvp=pvp_params, required_level=pve.LevelLimit, skill=skill, sp_cost=pve.NeedSkillPoint, sp_cost_cumulative=sp_cumulative, cooldown_pve=pve.DelayTime*0.001, cooldown_pvp=pvp.DelayTime*0.001, mp_cost_pve=pve.DecreaseSP*0.1, mp_cost_pvp=pvp.DecreaseSP*0.1) slevel.save() log.info('Parsed %d SkillLevels' % SkillLevel.objects.all().count())
def import_slevels(self, slevelfiles): """Import skilllevels from skillleveltable_characterx.dnt to django models.""" # Ugly and inefficient # Should avoid loading all slevels into memory before parsing rows = [] for f in slevelfiles: slevelfile = DNTFile(f) log.info('import_slevels\tfile\t%s' % slevelfile.filename) slevelfile.read_all() log.info('import_slevels\tParsed DNT File') rows.extend(slevelfile.rows) desc_re = re.compile(r'\{(\d+)\}') repl = lambda m: self._uistring[int(m.group(1))] # sort the rows so it goes 1-pve, 1-pvp, 2-pve, 2-pvp... rows.sort(key=lambda x: (x.SkillLevel, x.id)) for oldid, newid in self._skillmap.iteritems(): skill = Skill.objects.filter(id=newid).get() flt = lambda x: x.SkillIndex == oldid and x.SkillLevel <= 100 slevels = filter(flt, rows) if len(slevels) < 2 or len(slevels) % 2 != 0: continue skill.description = self._uistring[slevels[0].SkillExplanationID] skill.save(update_fields=['description']) sp_cumulative = 0 for pve, pvp in zip(slevels[::2], slevels[1::2]): pve_params = desc_re.sub(repl, pve.SkillExplanationIDParam) pvp_params = desc_re.sub(repl, pvp.SkillExplanationIDParam) sp_cumulative += pve.NeedSkillPoint assert pve.SkillLevel == pvp.SkillLevel, 'Slevel ordering error' slevel = SkillLevel(level=pve.SkillLevel, description_params_pve=pve_params, description_params_pvp=pvp_params, required_level=pve.LevelLimit, skill=skill, sp_cost=pve.NeedSkillPoint, sp_cost_cumulative=sp_cumulative, cooldown_pve=pve.DelayTime * 0.001, cooldown_pvp=pvp.DelayTime * 0.001, mp_cost_pve=pve.DecreaseSP * 0.1, mp_cost_pvp=pvp.DecreaseSP * 0.1) slevel.save() log.info('Parsed %d SkillLevels' % SkillLevel.objects.all().count())
def handle(self, *args, **options): """Main import function.""" log.info('skill.management.commands.import') filedir = args[0] assert os.path.isdir(filedir), 'Argument must be a directory path' filename = [os.path.join(filedir, x) for x in _dntlist] missing = [x for x in filename if not os.path.isfile(x)] assert len(missing) == 0, 'Files %s not found' % missing log.info('Resource checks passed.') log.info('Cleaning database') SkillLevel.objects.all().delete() Skill.objects.all().delete() Job.objects.all().delete() log.info('Beginning Import') self.import_uistring(filename[0]) self.import_jobs(DNTFile(filename[1])) self.import_skills(DNTFile(filename[2])) self.import_slevels(filename[4:]) self.import_skilltree(DNTFile(filename[3])) log.info('Cleaning Unnessecary Skills') Skill.objects.filter(tree_index=None).delete()
_SQLTYPEMAP = { column.Varchar : sqla.String(255), column.Boolean : sqla.Boolean, column.Integer : sqla.Integer, column.Float : sqla.Float } engine = sqla.create_engine('sqlite:///dnt.db', echo=False) metadata = sqla.MetaData() for dnt_filename in dnt_filenames: if os.stat(dnt_filename).st_size == 0: continue print dnt_filename dntfile = DNTFile(dnt_filename) dntfile.read_all() ## Column and Table Setup table_name = os.path.basename(dnt_filename[:-4]) table_cols = [] for col in dntfile.columns: if col.name == 'id': table_cols.append( sqla.Column('id', sqla.Integer, primary_key=True) ) else: table_cols.append( sqla.Column(col.name, _SQLTYPEMAP[type(col)]) ) table = sqla.Table(table_name, metadata, *table_cols) metadata.create_all(engine) col_names = [ x.name for x in dntfile.columns ] data = [ dict(zip(col_names, row['data'])) for row in dntfile.rows ]