diff --git a/dejaqt/folders.py b/dejaqt/folders.py new file mode 100644 index 0000000..f5f89cf --- /dev/null +++ b/dejaqt/folders.py @@ -0,0 +1,79 @@ + +import logging, os +try: + from django.conf import settings +except: + logging.error('Django Settings could not be loaded. Maybe Django has not been initialized?') + settings = None + +class FolderLibrary(object): + def __init__(self, folders=None): + self._folders = {} + try: + if settings: + self.folders.update( getattr(settings, 'DEJAQT_DIRS', {}) ) + except: + logging.error('DEJAQT_DIRS in django settings is corrupt.') + if folders: + # no try here: if this fails, you got yourself a programming error. + self.folders.update(folders) + self._keys = [] + self.build_keycache() + + def get_folders(self): + return self._folders + + def set_folders(self, folders): + self._folders = folders + self.build_keycache() + folders = property(get_folders, set_folders) + + def build_keycache(self): + self._keys = self._folders.keys() + self._keys.sort(key=lambda item: (-len(item), item)) + + def add_folder(self, url, folder): + if not url: + url = '' + self._folders[url] = folder + self.build_keycache() + + def match(self, url): + # run down our keycache, first match wins. + for key in self._keys: + if url.startswith(key): + return key + + def matched_folder(self, url): + m = self.match(url) + if m is not None: + real_folder = self._folders[m] + print m + print url + print url[len(m):] + print os.path.split(real_folder) + print os.path.split(url) + return real_folder + + def print_folders(self): + print '{' + for k in self._keys: + print "'%s': '%s'" % (k, self._folders[k]) + print '}' + + +if __name__ == "__main__": + # test this: + f = FolderLibrary({'abc/dab/': 'c:/dab', + 'abc': 'd:/abc', + 'abc/dab/tmp': '/tmp', + 'uiuiui': 'x:/', + 'abc/vul/no': 'x:/2', + 'abc/vul': 'x:/3', + 'abc/vul/yes': 'x:/1', + }) + f.add_folder('abc/dub/', 'c:/dubdub') + f.print_folders() + + print f.matched_folder('abc/dab/okokok/hurnkint.pdf') + \ No newline at end of file diff --git a/dj/scon/admin.py b/dj/scon/admin.py index 8c38f3f..1c94f0c 100644 --- a/dj/scon/admin.py +++ b/dj/scon/admin.py @@ -1,3 +1,6 @@ from django.contrib import admin - +import models # Register your models here. +admin.site.register(models.Crafting) +admin.site.register(models.CraftingInput) +admin.site.register(models.Item) diff --git a/dj/scon/fixtures/generated.json b/dj/scon/fixtures/generated.json new file mode 100644 index 0000000..aed78a5 --- /dev/null +++ b/dj/scon/fixtures/generated.json @@ -0,0 +1 @@ +[{"fields": {"sell_price": 6600, "tech": 0, "name": "Tungsten ore", "craftable": true, "typ": 12, "icon": "resource_tungsten_ore"}, "model": "scon.item", "pk": 1}, {"fields": {"sell_price": 4500, "tech": 0, "name": "Osmium ore", "craftable": true, "typ": 12, "icon": "resource_osmium_ore"}, "model": "scon.item", "pk": 2}, {"fields": {"sell_price": 600, "tech": 0, "name": "Silicon ore", "craftable": true, "typ": 12, "icon": "resource_silicon_ore"}, "model": "scon.item", "pk": 3}, {"fields": {"sell_price": 500, "tech": 0, "name": "Vanadium", "craftable": true, "typ": 12, "icon": "resource_vanadium"}, "model": "scon.item", "pk": 4}, {"fields": {"sell_price": 3500, "tech": 0, "name": "Crystal shard", "craftable": true, "typ": 12, "icon": "resource_crystal_shard"}, "model": "scon.item", "pk": 5}, {"fields": {"sell_price": 20000, "tech": 0, "name": "Tungsten plate", "description": "Durable tungsten plate", "craftable": true, "typ": 13, "icon": "component_tungsten_plate"}, "model": "scon.item", "pk": 6}, {"fields": {"sell_price": 42000, "tech": 0, "name": "Screened battery", "craftable": true, "typ": 13, "icon": "component_screened_battery"}, "model": "scon.item", "pk": 7}, {"fields": {"sell_price": 5500, "tech": 0, "name": "Osmium crystals", "craftable": true, "typ": 13, "icon": "component_osmium_crystals"}, "model": "scon.item", "pk": 8}, {"fields": {"sell_price": 2500, "tech": 0, "name": "Pure Silicon", "craftable": true, "typ": 13, "icon": "component_pure_silicon"}, "model": "scon.item", "pk": 9}, {"fields": {"sell_price": 22000, "tech": 0, "name": "Processing block", "craftable": true, "typ": 13, "icon": "component_processing_block"}, "model": "scon.item", "pk": 10}, {"fields": {"sell_price": 1600, "tech": 0, "name": "Metal blank", "craftable": true, "typ": 13, "icon": "component_metal_blank"}, "model": "scon.item", "pk": 11}, {"fields": {"sell_price": 25000, "tech": 0, "name": "Alien Monocrystal", "craftable": true, "typ": 13, "icon": "component_alien_monocrystal"}, "model": "scon.item", "pk": 12}, {"fields": {"sell_price": 4500, "tech": 0, "name": "Computing chip", "craftable": true, "typ": 13, "icon": "component_computing_chip"}, "model": "scon.item", "pk": 13}, {"fields": {"sell_price": 1000, "tech": 0, "name": "Explosive Shells", "quality": 4, "craftable": true, "typ": 8, "icon": "ammo_explosive_shells_mk4"}, "model": "scon.item", "pk": 14}, {"fields": {"sell_price": 1000, "tech": 0, "name": "Double Deflector", "quality": 4, "craftable": true, "typ": 8, "icon": "ammo_double_deflector_mk4"}, "model": "scon.item", "pk": 15}, {"fields": {"sell_price": 1000, "tech": 0, "name": "Xenon Lamp", "quality": 4, "craftable": true, "typ": 8, "icon": "ammo_xenon_lamp_mk4"}, "model": "scon.item", "pk": 16}, {"fields": {"sell_price": 1092, "tech": 0, "name": "Attack Drone", "quality": 10, "craftable": true, "typ": 8, "icon": "ammo_attack_drone"}, "model": "scon.item", "pk": 17}, {"fields": {"sell_price": 1000, "tech": 0, "name": "Focusing Lens", "quality": 4, "craftable": true, "typ": 8, "icon": "ammo_focusing_lens"}, "model": "scon.item", "pk": 18}, {"fields": {"sell_price": 1000, "tech": 0, "name": "Iridium Slugs", "quality": 4, "craftable": true, "typ": 8, "icon": "ammo_iridium_slugs"}, "model": "scon.item", "pk": 19}, {"fields": {"sell_price": 1000, "tech": 0, "name": "Supercooled Charges", "quality": 4, "craftable": true, "typ": 8, "icon": "ammo_supercooled_charges"}, "model": "scon.item", "pk": 20}, {"fields": {"name": "Doomsday Missile", "quality": 1, "craftable": true, "sell_price": 1000, "tech": 5, "typ": 8, "icon": "ammo_doomsday_missile"}, "model": "scon.item", "pk": 21}, {"fields": {"sell_price": 8000, "buy_price_premium": 200, "name": "Duplicator", "icon": "duplicator", "craftable": true, "typ": 0, "description": "Revives in Invasion with Cargo once."}, "model": "scon.item", "pk": 22}, {"fields": {"name": "A1MA IV", "typ": 8, "craftable": true, "sell_price": 26910, "tech": 4, "role": 0, "quality": 1, "icon": "active_a1ma"}, "model": "scon.item", "pk": 23}, {"fields": {"tech": 5, "name": "Pirate \"Orion\" Targeting Complex V", "role": 3, "craftable": true, "quality": 14, "typ": 8, "icon": "active_t5_orion_targeting_complex_pirate"}, "model": "scon.item", "pk": 24}, {"fields": {"tech": 5, "name": "Pirate Engine Overcharge V", "role": 6, "craftable": true, "quality": 14, "typ": 8, "icon": "active_t5_engine_overcharge_pirate"}, "model": "scon.item", "pk": 25}, {"fields": {"tech": 5, "name": "Pirate Mass Shield Generator V", "role": 7, "craftable": true, "quality": 14, "typ": 8, "icon": "active_t5_mass_shield_generator_pirate"}, "model": "scon.item", "pk": 26}, {"fields": {"tech": 3, "name": "Reverse Thruster III", "role": 9, "craftable": true, "quality": 1, "typ": 8, "icon": "active_reverse_thruster"}, "model": "scon.item", "pk": 27}, {"fields": {"tech": 4, "name": "Reverse Thruster IV", "role": 9, "craftable": true, "quality": 1, "typ": 8, "icon": "active_reverse_thruster"}, "model": "scon.item", "pk": 28}, {"fields": {"tech": 5, "name": "Reverse Thruster V", "role": 9, "craftable": true, "quality": 1, "typ": 8, "icon": "active_reverse_thruster"}, "model": "scon.item", "pk": 29}, {"fields": {"tech": 3, "name": "Alien Plasma Gun III", "quality": 5, "craftable": true, "typ": 7, "icon": "weapon_plasma_gun_mk5"}, "model": "scon.item", "pk": 30}, {"fields": {"tech": 4, "name": "Alien Plasma Gun IV", "quality": 5, "craftable": true, "typ": 7, "icon": "weapon_plasma_gun_mk5"}, "model": "scon.item", "pk": 31}, {"fields": {"tech": 5, "name": "Alien Plasma Gun V", "quality": 5, "craftable": true, "typ": 7, "icon": "weapon_plasma_gun_mk5"}, "model": "scon.item", "pk": 32}, {"fields": {"tech": 3, "name": "Alien Assault Railgun III", "quality": 5, "craftable": true, "typ": 7, "icon": "weapon_assault_rail_mk5"}, "model": "scon.item", "pk": 33}, {"fields": {"tech": 4, "name": "Alien Assault Railgun IV", "quality": 5, "craftable": true, "typ": 7, "icon": "weapon_assault_rail_mk5"}, "model": "scon.item", "pk": 34}, {"fields": {"tech": 5, "name": "Alien Assault Railgun V", "quality": 5, "craftable": true, "typ": 7, "icon": "weapon_assault_rail_mk5"}, "model": "scon.item", "pk": 35}, {"fields": {"tech": 3, "name": "Alien Beam Cannon III", "quality": 5, "craftable": true, "typ": 7, "icon": "weapon_beam_cannon_mk5"}, "model": "scon.item", "pk": 36}, {"fields": {"tech": 4, "name": "Alien Beam Cannon IV", "quality": 5, "craftable": true, "typ": 7, "icon": "weapon_beam_cannon_mk5"}, "model": "scon.item", "pk": 37}, {"fields": {"tech": 5, "name": "Alien Beam Cannon V", "quality": 5, "craftable": true, "typ": 7, "icon": "weapon_beam_cannon_mk5"}, "model": "scon.item", "pk": 38}, {"fields": {"sell_price": 20188, "tech": 3, "name": "Target Tracking Coprocessor III", "icon": "cpu_target_tracking_coprocessor", "craftable": false, "typ": 5, "description": "Increases Critical Damage"}, "model": "scon.item", "pk": 39}, {"fields": {"tech": 3, "name": "Plasma Gun III", "typ": 7, "craftable": false, "quality": 4, "icon": "weapon_plasma_gun"}, "model": "scon.item", "pk": 40}, {"fields": {"tech": 4, "name": "Plasma Gun IV", "typ": 7, "craftable": false, "quality": 4, "icon": "weapon_plasma_gun"}, "model": "scon.item", "pk": 41}, {"fields": {"tech": 5, "name": "Plasma Gun V", "typ": 7, "craftable": false, "quality": 4, "icon": "weapon_plasma_gun"}, "model": "scon.item", "pk": 42}, {"fields": {"tech": 3, "name": "Assault Railgun III", "typ": 7, "craftable": false, "quality": 4, "icon": "weapon_assault_railgun"}, "model": "scon.item", "pk": 43}, {"fields": {"tech": 4, "name": "Assault Railgun IV", "typ": 7, "craftable": false, "quality": 4, "icon": "weapon_assault_railgun"}, "model": "scon.item", "pk": 44}, {"fields": {"tech": 5, "name": "Assault Railgun V", "typ": 7, "craftable": false, "quality": 4, "icon": "weapon_assault_railgun"}, "model": "scon.item", "pk": 45}, {"fields": {"tech": 3, "name": "Beam Cannon III", "typ": 7, "craftable": false, "quality": 4, "icon": "weapon_beam_cannon"}, "model": "scon.item", "pk": 46}, {"fields": {"tech": 4, "name": "Beam Cannon IV", "typ": 7, "craftable": false, "quality": 4, "icon": "weapon_beam_cannon"}, "model": "scon.item", "pk": 47}, {"fields": {"tech": 5, "name": "Beam Cannon V", "typ": 7, "craftable": false, "quality": 4, "icon": "weapon_beam_cannon"}, "model": "scon.item", "pk": 48}, {"fields": {"tech": 0, "craftable": true, "typ": 11, "name": "Focusing Lens Blueprint", "icon": "blueprint"}, "model": "scon.item", "pk": 49}, {"fields": {"tech": 0, "craftable": true, "typ": 11, "name": "Iridium Slugs Blueprint", "icon": "blueprint"}, "model": "scon.item", "pk": 50}, {"fields": {"tech": 0, "craftable": true, "typ": 11, "name": "Supercooled Charges Blueprint", "icon": "blueprint"}, "model": "scon.item", "pk": 51}, {"fields": {"tech": 0, "craftable": true, "typ": 11, "name": "A1MA T4 Blueprint", "icon": "blueprint"}, "model": "scon.item", "pk": 52}, {"fields": {"tech": 0, "name": "Orion-2 Targeting Complex Blueprint", "description": "Module works twice as long but much weaker.", "craftable": true, "typ": 11, "icon": "blueprint"}, "model": "scon.item", "pk": 53}, {"fields": {"tech": 0, "craftable": true, "typ": 11, "name": "Engine Warp Overcharge Blueprint", "icon": "blueprint"}, "model": "scon.item", "pk": 54}, {"fields": {"tech": 0, "craftable": true, "typ": 11, "name": "Mass Shield Energizer Blueprint", "icon": "blueprint"}, "model": "scon.item", "pk": 55}, {"fields": {"tech": 0, "craftable": true, "typ": 11, "name": "Reverse Thruster T3 Blueprint", "icon": "blueprint"}, "model": "scon.item", "pk": 56}, {"fields": {"tech": 0, "craftable": true, "typ": 11, "name": "Reverse Thruster T4 Blueprint", "icon": "blueprint"}, "model": "scon.item", "pk": 57}, {"fields": {"tech": 0, "craftable": true, "typ": 11, "name": "Reverse Thruster T5 Blueprint", "icon": "blueprint"}, "model": "scon.item", "pk": 58}, {"fields": {"tech": 0, "craftable": true, "typ": 11, "name": "Beam Cannon Prototype T3 Blueprint", "icon": "blueprint"}, "model": "scon.item", "pk": 59}, {"fields": {"tech": 0, "craftable": true, "typ": 11, "name": "Beam Cannon Prototype T4 Blueprint", "icon": "blueprint"}, "model": "scon.item", "pk": 60}, {"fields": {"tech": 0, "craftable": true, "typ": 11, "name": "Beam Cannon Prototype T5 Blueprint", "icon": "blueprint"}, "model": "scon.item", "pk": 61}, {"fields": {"tech": 0, "craftable": true, "typ": 11, "name": "Assault Railgun Prototype T3 Blueprint", "icon": "blueprint"}, "model": "scon.item", "pk": 62}, {"fields": {"tech": 0, "craftable": true, "typ": 11, "name": "Assault Railgun Prototype T4 Blueprint", "icon": "blueprint"}, "model": "scon.item", "pk": 63}, {"fields": {"tech": 0, "craftable": true, "typ": 11, "name": "Assault Railgun Prototype T5 Blueprint", "icon": "blueprint"}, "model": "scon.item", "pk": 64}, {"fields": {"tech": 0, "craftable": true, "typ": 11, "name": "Plasma Gun Prototype T3 Blueprint", "icon": "blueprint"}, "model": "scon.item", "pk": 65}, {"fields": {"tech": 0, "craftable": true, "typ": 11, "name": "Plasma Gun Prototype T4 Blueprint", "icon": "blueprint"}, "model": "scon.item", "pk": 66}, {"fields": {"tech": 0, "craftable": true, "typ": 11, "name": "Plasma Gun Prototype T5 Blueprint", "icon": "blueprint"}, "model": "scon.item", "pk": 67}, {"fields": {"tech": 0, "craftable": true, "typ": 11, "name": "Doomsday Missile Blueprint", "icon": "blueprint"}, "model": "scon.item", "pk": 68}, {"pk": 1, "model": "scon.crafting", "fields": {"output": 22, "amount": 1}}, {"pk": 1, "model": "scon.craftinginput", "fields": {"item": 10, "crafting": 1, "amount": 1, "primary": true}}, {"pk": 2, "model": "scon.craftinginput", "fields": {"item": 13, "crafting": 1, "amount": 2, "primary": false}}, {"pk": 3, "model": "scon.craftinginput", "fields": {"item": 11, "crafting": 1, "amount": 2, "primary": false}}, {"pk": 2, "model": "scon.crafting", "fields": {"output": 6, "amount": 1}}, {"pk": 4, "model": "scon.craftinginput", "fields": {"item": 1, "crafting": 2, "amount": 2, "primary": true}}, {"pk": 3, "model": "scon.crafting", "fields": {"output": 7, "amount": 1}}, {"pk": 5, "model": "scon.craftinginput", "fields": {"item": 6, "crafting": 3, "amount": 1, "primary": true}}, {"pk": 6, "model": "scon.craftinginput", "fields": {"item": 13, "crafting": 3, "amount": 2, "primary": false}}, {"pk": 4, "model": "scon.crafting", "fields": {"output": 8, "amount": 1}}, {"pk": 7, "model": "scon.craftinginput", "fields": {"item": 2, "crafting": 4, "amount": 1, "primary": true}}, {"pk": 5, "model": "scon.crafting", "fields": {"output": 9, "amount": 1}}, {"pk": 8, "model": "scon.craftinginput", "fields": {"item": 3, "crafting": 5, "amount": 1, "primary": true}}, {"pk": 6, "model": "scon.crafting", "fields": {"output": 13, "amount": 1}}, {"pk": 9, "model": "scon.craftinginput", "fields": {"item": 5, "crafting": 6, "amount": 1, "primary": true}}, {"pk": 7, "model": "scon.crafting", "fields": {"output": 10, "amount": 1}}, {"pk": 10, "model": "scon.craftinginput", "fields": {"item": 9, "crafting": 7, "amount": 4, "primary": true}}, {"pk": 11, "model": "scon.craftinginput", "fields": {"item": 13, "crafting": 7, "amount": 2, "primary": false}}, {"pk": 8, "model": "scon.crafting", "fields": {"output": 11, "amount": 1}}, {"pk": 12, "model": "scon.craftinginput", "fields": {"item": 4, "crafting": 8, "amount": 2, "primary": true}}, {"pk": 9, "model": "scon.crafting", "fields": {"output": 39, "amount": 1}}, {"pk": 13, "model": "scon.craftinginput", "fields": {"item": 7, "crafting": 9, "amount": 1, "primary": true}}, {"pk": 14, "model": "scon.craftinginput", "fields": {"item": 11, "crafting": 9, "amount": 7, "primary": false}}, {"pk": 15, "model": "scon.craftinginput", "fields": {"item": 9, "crafting": 9, "amount": 5, "primary": false}}, {"pk": 10, "model": "scon.crafting", "fields": {"output": 14, "amount": 2}}, {"pk": 16, "model": "scon.craftinginput", "fields": {"item": 11, "crafting": 10, "amount": 1, "primary": true}}, {"pk": 17, "model": "scon.craftinginput", "fields": {"item": 9, "crafting": 10, "amount": 2, "primary": false}}, {"pk": 11, "model": "scon.crafting", "fields": {"output": 17, "amount": 1}}, {"pk": 18, "model": "scon.craftinginput", "fields": {"item": 12, "crafting": 11, "amount": 1, "primary": true}}, {"pk": 19, "model": "scon.craftinginput", "fields": {"item": 13, "crafting": 11, "amount": 1, "primary": false}}, {"pk": 12, "model": "scon.crafting", "fields": {"output": 15, "amount": 2}}, {"pk": 20, "model": "scon.craftinginput", "fields": {"item": 8, "crafting": 12, "amount": 1, "primary": true}}, {"pk": 13, "model": "scon.crafting", "fields": {"output": 16, "amount": 2}}, {"pk": 21, "model": "scon.craftinginput", "fields": {"item": 13, "crafting": 13, "amount": 1, "primary": true}}, {"pk": 22, "model": "scon.craftinginput", "fields": {"item": 9, "crafting": 13, "amount": 1, "primary": false}}, {"pk": 14, "model": "scon.crafting", "fields": {"output": 18, "amount": 2}}, {"pk": 23, "model": "scon.craftinginput", "fields": {"item": 49, "crafting": 14, "amount": 1, "primary": true}}, {"pk": 24, "model": "scon.craftinginput", "fields": {"item": 8, "crafting": 14, "amount": 1, "primary": false}}, {"pk": 15, "model": "scon.crafting", "fields": {"output": 20, "amount": 2}}, {"pk": 25, "model": "scon.craftinginput", "fields": {"item": 51, "crafting": 15, "amount": 1, "primary": true}}, {"pk": 26, "model": "scon.craftinginput", "fields": {"item": 13, "crafting": 15, "amount": 1, "primary": false}}, {"pk": 16, "model": "scon.crafting", "fields": {"output": 19, "amount": 2}}, {"pk": 27, "model": "scon.craftinginput", "fields": {"item": 50, "crafting": 16, "amount": 1, "primary": true}}, {"pk": 28, "model": "scon.craftinginput", "fields": {"item": 11, "crafting": 16, "amount": 1, "primary": false}}, {"pk": 17, "model": "scon.crafting", "fields": {"output": 23, "amount": 1}}, {"pk": 29, "model": "scon.craftinginput", "fields": {"item": 52, "crafting": 17, "amount": 1, "primary": true}}, {"pk": 30, "model": "scon.craftinginput", "fields": {"item": 10, "crafting": 17, "amount": 2, "primary": false}}, {"pk": 31, "model": "scon.craftinginput", "fields": {"item": 11, "crafting": 17, "amount": 14, "primary": false}}, {"pk": 32, "model": "scon.craftinginput", "fields": {"item": 7, "crafting": 17, "amount": 2, "primary": false}}, {"pk": 33, "model": "scon.craftinginput", "fields": {"item": 12, "crafting": 17, "amount": 20, "primary": false}}, {"pk": 18, "model": "scon.crafting", "fields": {"output": 24, "amount": 1}}, {"pk": 34, "model": "scon.craftinginput", "fields": {"item": 53, "crafting": 18, "amount": 1, "primary": true}}, {"pk": 35, "model": "scon.craftinginput", "fields": {"item": 6, "crafting": 18, "amount": 3, "primary": false}}, {"pk": 36, "model": "scon.craftinginput", "fields": {"item": 13, "crafting": 18, "amount": 4, "primary": false}}, {"pk": 37, "model": "scon.craftinginput", "fields": {"item": 10, "crafting": 18, "amount": 2, "primary": false}}, {"pk": 38, "model": "scon.craftinginput", "fields": {"item": 12, "crafting": 18, "amount": 30, "primary": false}}, {"pk": 19, "model": "scon.crafting", "fields": {"output": 25, "amount": 1}}, {"pk": 39, "model": "scon.craftinginput", "fields": {"item": 54, "crafting": 19, "amount": 1, "primary": true}}, {"pk": 40, "model": "scon.craftinginput", "fields": {"item": 6, "crafting": 19, "amount": 3, "primary": false}}, {"pk": 41, "model": "scon.craftinginput", "fields": {"item": 8, "crafting": 19, "amount": 2, "primary": false}}, {"pk": 42, "model": "scon.craftinginput", "fields": {"item": 10, "crafting": 19, "amount": 2, "primary": false}}, {"pk": 43, "model": "scon.craftinginput", "fields": {"item": 12, "crafting": 19, "amount": 30, "primary": false}}, {"pk": 20, "model": "scon.crafting", "fields": {"output": 26, "amount": 1}}, {"pk": 44, "model": "scon.craftinginput", "fields": {"item": 55, "crafting": 20, "amount": 1, "primary": true}}, {"pk": 45, "model": "scon.craftinginput", "fields": {"item": 11, "crafting": 20, "amount": 10, "primary": false}}, {"pk": 46, "model": "scon.craftinginput", "fields": {"item": 13, "crafting": 20, "amount": 3, "primary": false}}, {"pk": 47, "model": "scon.craftinginput", "fields": {"item": 10, "crafting": 20, "amount": 3, "primary": false}}, {"pk": 48, "model": "scon.craftinginput", "fields": {"item": 12, "crafting": 20, "amount": 30, "primary": false}}, {"pk": 21, "model": "scon.crafting", "fields": {"output": 27, "amount": 1}}, {"pk": 49, "model": "scon.craftinginput", "fields": {"item": 56, "crafting": 21, "amount": 1, "primary": true}}, {"pk": 50, "model": "scon.craftinginput", "fields": {"item": 11, "crafting": 21, "amount": 7, "primary": false}}, {"pk": 51, "model": "scon.craftinginput", "fields": {"item": 7, "crafting": 21, "amount": 1, "primary": false}}, {"pk": 52, "model": "scon.craftinginput", "fields": {"item": 13, "crafting": 21, "amount": 4, "primary": false}}, {"pk": 53, "model": "scon.craftinginput", "fields": {"item": 12, "crafting": 21, "amount": 15, "primary": false}}, {"pk": 22, "model": "scon.crafting", "fields": {"output": 28, "amount": 1}}, {"pk": 54, "model": "scon.craftinginput", "fields": {"item": 57, "crafting": 22, "amount": 1, "primary": true}}, {"pk": 55, "model": "scon.craftinginput", "fields": {"item": 11, "crafting": 22, "amount": 12, "primary": false}}, {"pk": 56, "model": "scon.craftinginput", "fields": {"item": 7, "crafting": 22, "amount": 2, "primary": false}}, {"pk": 57, "model": "scon.craftinginput", "fields": {"item": 13, "crafting": 22, "amount": 5, "primary": false}}, {"pk": 58, "model": "scon.craftinginput", "fields": {"item": 12, "crafting": 22, "amount": 20, "primary": false}}, {"pk": 23, "model": "scon.crafting", "fields": {"output": 29, "amount": 1}}, {"pk": 59, "model": "scon.craftinginput", "fields": {"item": 58, "crafting": 23, "amount": 1, "primary": true}}, {"pk": 60, "model": "scon.craftinginput", "fields": {"item": 6, "crafting": 23, "amount": 7, "primary": false}}, {"pk": 61, "model": "scon.craftinginput", "fields": {"item": 7, "crafting": 23, "amount": 3, "primary": false}}, {"pk": 62, "model": "scon.craftinginput", "fields": {"item": 13, "crafting": 23, "amount": 6, "primary": false}}, {"pk": 63, "model": "scon.craftinginput", "fields": {"item": 12, "crafting": 23, "amount": 30, "primary": false}}, {"pk": 24, "model": "scon.crafting", "fields": {"output": 30, "amount": 1}}, {"pk": 64, "model": "scon.craftinginput", "fields": {"item": 65, "crafting": 24, "amount": 1, "primary": true}}, {"pk": 65, "model": "scon.craftinginput", "fields": {"item": 40, "crafting": 24, "amount": 1, "primary": false}}, {"pk": 66, "model": "scon.craftinginput", "fields": {"item": 11, "crafting": 24, "amount": 6, "primary": false}}, {"pk": 67, "model": "scon.craftinginput", "fields": {"item": 7, "crafting": 24, "amount": 3, "primary": false}}, {"pk": 68, "model": "scon.craftinginput", "fields": {"item": 12, "crafting": 24, "amount": 30, "primary": false}}, {"pk": 25, "model": "scon.crafting", "fields": {"output": 31, "amount": 1}}, {"pk": 69, "model": "scon.craftinginput", "fields": {"item": 66, "crafting": 25, "amount": 1, "primary": true}}, {"pk": 70, "model": "scon.craftinginput", "fields": {"item": 41, "crafting": 25, "amount": 1, "primary": false}}, {"pk": 71, "model": "scon.craftinginput", "fields": {"item": 6, "crafting": 25, "amount": 1, "primary": false}}, {"pk": 72, "model": "scon.craftinginput", "fields": {"item": 7, "crafting": 25, "amount": 4, "primary": false}}, {"pk": 73, "model": "scon.craftinginput", "fields": {"item": 12, "crafting": 25, "amount": 50, "primary": false}}, {"pk": 26, "model": "scon.crafting", "fields": {"output": 32, "amount": 1}}, {"pk": 74, "model": "scon.craftinginput", "fields": {"item": 67, "crafting": 26, "amount": 1, "primary": true}}, {"pk": 75, "model": "scon.craftinginput", "fields": {"item": 42, "crafting": 26, "amount": 1, "primary": false}}, {"pk": 76, "model": "scon.craftinginput", "fields": {"item": 6, "crafting": 26, "amount": 3, "primary": false}}, {"pk": 77, "model": "scon.craftinginput", "fields": {"item": 7, "crafting": 26, "amount": 5, "primary": false}}, {"pk": 78, "model": "scon.craftinginput", "fields": {"item": 12, "crafting": 26, "amount": 70, "primary": false}}, {"pk": 27, "model": "scon.crafting", "fields": {"output": 33, "amount": 1}}, {"pk": 79, "model": "scon.craftinginput", "fields": {"item": 62, "crafting": 27, "amount": 1, "primary": true}}, {"pk": 80, "model": "scon.craftinginput", "fields": {"item": 43, "crafting": 27, "amount": 1, "primary": false}}, {"pk": 81, "model": "scon.craftinginput", "fields": {"item": 11, "crafting": 27, "amount": 6, "primary": false}}, {"pk": 82, "model": "scon.craftinginput", "fields": {"item": 7, "crafting": 27, "amount": 3, "primary": false}}, {"pk": 83, "model": "scon.craftinginput", "fields": {"item": 12, "crafting": 27, "amount": 30, "primary": false}}, {"pk": 28, "model": "scon.crafting", "fields": {"output": 34, "amount": 1}}, {"pk": 84, "model": "scon.craftinginput", "fields": {"item": 63, "crafting": 28, "amount": 1, "primary": true}}, {"pk": 85, "model": "scon.craftinginput", "fields": {"item": 44, "crafting": 28, "amount": 1, "primary": false}}, {"pk": 86, "model": "scon.craftinginput", "fields": {"item": 6, "crafting": 28, "amount": 1, "primary": false}}, {"pk": 87, "model": "scon.craftinginput", "fields": {"item": 7, "crafting": 28, "amount": 4, "primary": false}}, {"pk": 88, "model": "scon.craftinginput", "fields": {"item": 12, "crafting": 28, "amount": 50, "primary": false}}, {"pk": 29, "model": "scon.crafting", "fields": {"output": 35, "amount": 1}}, {"pk": 89, "model": "scon.craftinginput", "fields": {"item": 64, "crafting": 29, "amount": 1, "primary": true}}, {"pk": 90, "model": "scon.craftinginput", "fields": {"item": 45, "crafting": 29, "amount": 1, "primary": false}}, {"pk": 91, "model": "scon.craftinginput", "fields": {"item": 6, "crafting": 29, "amount": 3, "primary": false}}, {"pk": 92, "model": "scon.craftinginput", "fields": {"item": 7, "crafting": 29, "amount": 5, "primary": false}}, {"pk": 93, "model": "scon.craftinginput", "fields": {"item": 12, "crafting": 29, "amount": 70, "primary": false}}, {"pk": 30, "model": "scon.crafting", "fields": {"output": 36, "amount": 1}}, {"pk": 94, "model": "scon.craftinginput", "fields": {"item": 59, "crafting": 30, "amount": 1, "primary": true}}, {"pk": 95, "model": "scon.craftinginput", "fields": {"item": 46, "crafting": 30, "amount": 1, "primary": false}}, {"pk": 96, "model": "scon.craftinginput", "fields": {"item": 11, "crafting": 30, "amount": 6, "primary": false}}, {"pk": 97, "model": "scon.craftinginput", "fields": {"item": 7, "crafting": 30, "amount": 3, "primary": false}}, {"pk": 98, "model": "scon.craftinginput", "fields": {"item": 12, "crafting": 30, "amount": 30, "primary": false}}, {"pk": 31, "model": "scon.crafting", "fields": {"output": 37, "amount": 1}}, {"pk": 99, "model": "scon.craftinginput", "fields": {"item": 60, "crafting": 31, "amount": 1, "primary": true}}, {"pk": 100, "model": "scon.craftinginput", "fields": {"item": 47, "crafting": 31, "amount": 1, "primary": false}}, {"pk": 101, "model": "scon.craftinginput", "fields": {"item": 6, "crafting": 31, "amount": 1, "primary": false}}, {"pk": 102, "model": "scon.craftinginput", "fields": {"item": 7, "crafting": 31, "amount": 4, "primary": false}}, {"pk": 103, "model": "scon.craftinginput", "fields": {"item": 12, "crafting": 31, "amount": 50, "primary": false}}, {"pk": 32, "model": "scon.crafting", "fields": {"output": 38, "amount": 1}}, {"pk": 104, "model": "scon.craftinginput", "fields": {"item": 61, "crafting": 32, "amount": 1, "primary": true}}, {"pk": 105, "model": "scon.craftinginput", "fields": {"item": 48, "crafting": 32, "amount": 1, "primary": false}}, {"pk": 106, "model": "scon.craftinginput", "fields": {"item": 6, "crafting": 32, "amount": 3, "primary": false}}, {"pk": 107, "model": "scon.craftinginput", "fields": {"item": 7, "crafting": 32, "amount": 5, "primary": false}}, {"pk": 108, "model": "scon.craftinginput", "fields": {"item": 12, "crafting": 32, "amount": 70, "primary": false}}, {"pk": 33, "model": "scon.crafting", "fields": {"output": 21, "amount": 1}}, {"pk": 109, "model": "scon.craftinginput", "fields": {"item": 68, "crafting": 33, "amount": 1, "primary": true}}, {"pk": 110, "model": "scon.craftinginput", "fields": {"item": 8, "crafting": 33, "amount": 2, "primary": false}}, {"pk": 111, "model": "scon.craftinginput", "fields": {"item": 13, "crafting": 33, "amount": 1, "primary": false}}, {"pk": 112, "model": "scon.craftinginput", "fields": {"item": 11, "crafting": 33, "amount": 1, "primary": false}}] \ No newline at end of file diff --git a/dj/scon/generate_fixtures.py b/dj/scon/generate_fixtures.py new file mode 100644 index 0000000..283f640 --- /dev/null +++ b/dj/scon/generate_fixtures.py @@ -0,0 +1,565 @@ +""" + Generate Fixtures for Crafting. + Simple generator, does not integrate well into existing stuff, so please use + only for bootstrapping. +""" +import os, json +BASE_DIR = os.path.dirname(os.path.dirname(__file__)) +DIR = os.path.join(BASE_DIR, 'scon', 'fixtures') + +def write_fixture(data): + f = open(os.path.join(DIR, 'generated.json'), 'w') + f.write(json.dumps(data)) + f.close() + +def build_pk_cache(data, models=None): + pk_cache = {} + # fill cache from existing + for d in data: + if 'pk' in d.keys(): + # has pk + pk_cache[d['model']] = max(pk_cache.get('model', 0), d['pk']) + for d in data: + m = d['model'] + if models: + if m not in models: + continue + if 'pk' in d.keys(): + #print "PK was already in there! %s" % d + pass + else: + if m not in pk_cache.keys(): + pk_cache[m] = 1 + i = 1 + else: + i = pk_cache[m] + 1 + pk_cache[m] = i + d['pk'] = i + return data + +def lookup_pk(data, name, mdl='scon.item'): + for d in data: + if d['model'] == mdl: + if d['fields'].get('name', '').lower() == name.lower(): + return d['pk'] + +def generate_fixtures(): + data = [] + + ORES = [ + {'name': 'Tungsten ore', 'sell_price': 6600, 'icon': 'resource_tungsten_ore'}, + {'name': 'Osmium ore', 'sell_price': 4500, 'icon': 'resource_osmium_ore'}, + {'name': 'Silicon ore', 'sell_price': 600, 'icon': 'resource_silicon_ore'}, + {'name': 'Vanadium', 'sell_price': 500, 'icon': 'resource_vanadium'}, + {'name': 'Crystal shard', 'sell_price': 3500, 'icon': 'resource_crystal_shard'}, + ] + MATERIALS = [ + {'name': 'Tungsten plate', 'description': 'Durable tungsten plate', 'sell_price': 20000, + 'icon': 'component_tungsten_plate'}, + {'name': 'Screened battery', 'sell_price': 42000, 'icon': 'component_screened_battery'}, + {'name': 'Osmium crystals', 'sell_price': 5500, 'icon': 'component_osmium_crystals'}, + {'name': 'Pure Silicon', 'sell_price': 2500, 'icon': 'component_pure_silicon'}, + {'name': 'Processing block', 'sell_price': 22000, 'icon': 'component_processing_block'}, + {'name': 'Metal blank', 'sell_price': 1600, 'icon': 'component_metal_blank'}, + {'name': 'Alien Monocrystal', 'sell_price': 25000, 'icon': 'component_alien_monocrystal'}, + {'name': 'Computing chip', 'sell_price': 4500, 'icon': 'component_computing_chip'}, + ] + AMMOS = [ + {'name': 'Explosive Shells', + 'quality': 4, + 'sell_price': 1000, + 'icon': 'ammo_explosive_shells_mk4', + }, + {'name': 'Double Deflector', + 'quality': 4, + 'sell_price': 1000, + 'icon': 'ammo_double_deflector_mk4', + }, + {'name': 'Xenon Lamp', + 'quality': 4, + 'sell_price': 1000, + 'icon': 'ammo_xenon_lamp_mk4', + }, + {'name': 'Attack Drone', + 'quality': 10, + 'sell_price': 1092, + 'icon': 'ammo_attack_drone', + }, + {'name': 'Focusing Lens', + 'quality': 4, + 'sell_price': 1000, + 'icon': 'ammo_focusing_lens', + }, + {'name': 'Iridium Slugs', + 'quality': 4, + 'sell_price': 1000, + 'icon': 'ammo_iridium_slugs', + }, + {'name': 'Supercooled Charges', + 'quality': 4, + 'sell_price': 1000, + 'icon': 'ammo_supercooled_charges', + }, + {'name': 'Doomsday Missile', + 'quality': 1, + 'sell_price': 1000, + 'tech': 5, + 'icon': 'ammo_doomsday_missile', + } + ] + + ITEMS_NON_CRAFTING = [ + {'name': 'Target Tracking Coprocessor III', + 'typ': 5, # cpu + 'tech': 3, + 'sell_price': 20188, + 'description': 'Increases Critical Damage', + 'icon': 'cpu_target_tracking_coprocessor', + }, + {'name': 'Plasma Gun III', + 'typ': 7, # weap + 'quality': 4, + 'tech': 3, + 'icon': 'weapon_plasma_gun', + }, + {'name': 'Plasma Gun IV', + 'typ': 7, # weap + 'quality': 4, + 'tech': 4, + 'icon': 'weapon_plasma_gun', + }, + {'name': 'Plasma Gun V', + 'typ': 7, # weap + 'quality': 4, + 'tech': 5, + 'icon': 'weapon_plasma_gun', + }, + # assault rails: + {'name': 'Assault Railgun III', + 'typ': 7, # weap + 'quality': 4, + 'tech': 3, + 'icon': 'weapon_assault_railgun', + }, + {'name': 'Assault Railgun IV', + 'typ': 7, # weap + 'quality': 4, + 'tech': 4, + 'icon': 'weapon_assault_railgun', + }, + {'name': 'Assault Railgun V', + 'typ': 7, # weap + 'quality': 4, + 'tech': 5, + 'icon': 'weapon_assault_railgun', + }, + # beam cannon: + {'name': 'Beam Cannon III', + 'typ': 7, # weap + 'quality': 4, + 'tech': 3, + 'icon': 'weapon_beam_cannon', + }, + {'name': 'Beam Cannon IV', + 'typ': 7, # weap + 'quality': 4, + 'tech': 4, + 'icon': 'weapon_beam_cannon', + }, + {'name': 'Beam Cannon V', + 'typ': 7, # weap + 'quality': 4, + 'tech': 5, + 'icon': 'weapon_beam_cannon', + }, + ] + + ITEMS = [ + {'name': 'Duplicator', + 'typ': 0, + 'sell_price': 8000, + 'buy_price_premium': 200, + 'description': 'Revives in Invasion with Cargo once.', + 'icon': 'duplicator', + }, + {'name': 'A1MA IV', + 'quality': 1, + 'tech': 4, + 'typ': 8, # active. + 'role': 0, # multipurp. + 'sell_price': 26910, + 'icon': 'active_a1ma', + }, + {'name': 'Pirate "Orion" Targeting Complex V', + 'quality': 14, + 'tech': 5, + 'typ': 8, # active. + 'role': 3, # covops + 'icon': 'active_t5_orion_targeting_complex_pirate', + }, + {'name': 'Pirate Engine Overcharge V', + 'quality': 14, + 'tech': 5, + 'typ': 8, # active. + 'role': 6, # gunship + 'icon': 'active_t5_engine_overcharge_pirate', + }, + {'name': 'Pirate Mass Shield Generator V', + 'quality': 14, + 'tech': 5, + 'typ': 8, # active. + 'role': 7, # engi + 'icon': 'active_t5_mass_shield_generator_pirate', + }, + {'name': 'Reverse Thruster III', + 'quality': 1, + 'tech': 3, + 'typ': 8, # active. + 'role': 9, # LRF + 'icon': 'active_reverse_thruster', + }, + {'name': 'Reverse Thruster IV', + 'quality': 1, + 'tech': 4, + 'typ': 8, # active. + 'role': 9, # LRF + 'icon': 'active_reverse_thruster', + }, + {'name': 'Reverse Thruster V', + 'quality': 1, + 'tech': 5, + 'typ': 8, # active. + 'role': 9, # LRF + 'icon': 'active_reverse_thruster', + }, + {'name': 'Alien Plasma Gun III', + 'quality': 5, + 'tech': 3, + 'typ': 7, # weap + 'icon': 'weapon_plasma_gun_mk5', + }, + {'name': 'Alien Plasma Gun IV', + 'quality': 5, + 'tech': 4, + 'typ': 7, # weap + 'icon': 'weapon_plasma_gun_mk5', + }, + {'name': 'Alien Plasma Gun V', + 'quality': 5, + 'tech': 5, + 'typ': 7, # weap + 'icon': 'weapon_plasma_gun_mk5', + }, + {'name': 'Alien Assault Railgun III', + 'quality': 5, + 'tech': 3, + 'typ': 7, # weap + 'icon': 'weapon_assault_rail_mk5', + }, + {'name': 'Alien Assault Railgun IV', + 'quality': 5, + 'tech': 4, + 'typ': 7, # weap + 'icon': 'weapon_assault_rail_mk5', + }, + {'name': 'Alien Assault Railgun V', + 'quality': 5, + 'tech': 5, + 'typ': 7, # weap + 'icon': 'weapon_assault_rail_mk5', + }, + {'name': 'Alien Beam Cannon III', + 'quality': 5, + 'tech': 3, + 'typ': 7, # weap + 'icon': 'weapon_beam_cannon_mk5', + }, + {'name': 'Alien Beam Cannon IV', + 'quality': 5, + 'tech': 4, + 'typ': 7, # weap + 'icon': 'weapon_beam_cannon_mk5', + }, + {'name': 'Alien Beam Cannon V', + 'quality': 5, + 'tech': 5, + 'typ': 7, # weap + 'icon': 'weapon_beam_cannon_mk5', + }, + ] + BLUEPRINTS = [ + {'name': 'Focusing Lens Blueprint'}, + {'name': 'Iridium Slugs Blueprint'}, + {'name': 'Supercooled Charges Blueprint'}, + {'name': 'A1MA T4 Blueprint'}, + {'name': 'Orion-2 Targeting Complex Blueprint', + 'description': 'Module works twice as long but much weaker.'}, + {'name': 'Engine Warp Overcharge Blueprint'}, + {'name': 'Mass Shield Energizer Blueprint'}, + {'name': 'Reverse Thruster T3 Blueprint'}, + {'name': 'Reverse Thruster T4 Blueprint'}, + {'name': 'Reverse Thruster T5 Blueprint'}, + {'name': 'Beam Cannon Prototype T3 Blueprint'}, + {'name': 'Beam Cannon Prototype T4 Blueprint'}, + {'name': 'Beam Cannon Prototype T5 Blueprint'}, + {'name': 'Assault Railgun Prototype T3 Blueprint'}, + {'name': 'Assault Railgun Prototype T4 Blueprint'}, + {'name': 'Assault Railgun Prototype T5 Blueprint'}, + {'name': 'Plasma Gun Prototype T3 Blueprint'}, + {'name': 'Plasma Gun Prototype T4 Blueprint'}, + {'name': 'Plasma Gun Prototype T5 Blueprint'}, + {'name': 'Doomsday Missile Blueprint'}, + ] + CRAFTING = [ + {'item': 'Duplicator', + 'recipee': [(1, 'Processing Block'), (2,'Computing chip'), (2, 'Metal blank')]}, + {'item': 'Tungsten plate', + 'recipee': [(2, 'Tungsten ore'),]}, + {'item': 'Screened battery', + 'recipee': [(1, 'Tungsten plate'), (2, 'Computing chip')]}, + {'item': 'Osmium crystals', + 'recipee': [(1, 'Osmium ore'),]}, + {'item': 'Pure Silicon', + 'recipee': [(1, 'Silicon ore'),]}, + {'item': 'Computing chip', + 'recipee': [(1, 'Crystal shard'),]}, + {'item': 'Processing block', + 'recipee': [(4, 'Pure Silicon'), (2, 'Computing chip')]}, + {'item': 'Metal blank', + 'recipee': [(2, 'Vanadium'),]}, + {'item': 'Target Tracking Coprocessor III', + 'recipee': [(1, 'Screened battery'), (7, 'Metal blank'), (5, 'Pure silicon')]}, + {'item': 'Explosive Shells', + 'amount': 2, + 'recipee': [(1, 'Metal blank'),(2, 'Pure Silicon')]}, + {'item': 'Attack drone', + 'recipee': [(1, 'Alien Monocrystal'), (1,'Computing chip')]}, + {'item': 'Double Deflector', + 'amount': 2, + 'recipee': [(1, 'Osmium crystals'),]}, + {'item': 'Xenon Lamp', + 'amount': 2, + 'recipee': [(1, 'Computing chip'), (1, 'Pure Silicon')]}, + + {'item': 'Focusing Lens', + 'amount': 2, + 'recipee': [(1, 'Focusing Lens Blueprint'), (1, 'Osmium crystals')]}, + {'item': 'Supercooled Charges', + 'amount': 2, + 'recipee': [(1, 'Supercooled Charges Blueprint'), (1, 'Computing chip')]}, + {'item': 'Iridium Slugs', + 'amount': 2, + 'recipee': [(1, 'Iridium Slugs Blueprint'), (1, 'Metal blank')]}, + {'item': 'A1MA IV', + 'recipee': [(1, 'A1MA T4 Blueprint'), (2, 'Processing block'), + (14, 'Metal blank'), (2, 'Screened battery'), + (20, 'Alien Monocrystal')]}, + {'item': 'Pirate "Orion" Targeting Complex V', + 'recipee': [(1, 'Orion-2 Targeting Complex Blueprint'), + (3, 'Tungsten plate'), + (4, 'Computing chip'), + (2, 'Processing block'), + (30, 'Alien Monocrystal') + ]}, + {'item': 'Pirate Engine Overcharge V', + 'recipee': [(1, 'Engine Warp Overcharge Blueprint'), + (3, 'Tungsten plate'), + (2, 'Osmium crystals'), + (2, 'Processing block'), + (30, 'Alien Monocrystal') + ]}, + {'item': 'Pirate Mass Shield Generator V', + 'recipee': [(1, 'Mass Shield Energizer Blueprint'), + (10, 'Metal blank'), + (3, 'Computing chip'), + (3, 'Processing block'), + (30, 'Alien Monocrystal') + ]}, + # lrf reverse blink: + {'item': 'Reverse Thruster III', + 'recipee': [(1, 'Reverse Thruster T3 Blueprint'), + (7, 'Metal blank'), + (1, 'Screened battery'), + (4, 'Computing chip'), + (15, 'Alien Monocrystal') + ]}, + {'item': 'Reverse Thruster IV', + 'recipee': [(1, 'Reverse Thruster T4 Blueprint'), + (12, 'Metal blank'), + (2, 'Screened battery'), + (5, 'Computing chip'), + (20, 'Alien Monocrystal') + ]}, + {'item': 'Reverse Thruster V', + 'recipee': [(1, 'Reverse Thruster T5 Blueprint'), + (7, 'Tungsten plate'), + (3, 'Screened battery'), + (6, 'Computing chip'), + (30, 'Alien Monocrystal') + ]}, + + # plasma + {'item': 'Alien Plasma Gun III', + 'recipee': [(1, 'Plasma Gun Prototype T3 Blueprint'), + (1, 'Plasma Gun III'), + (6, 'Metal blank'), + (3, 'Screened battery'), + (30, 'Alien Monocrystal') + ]}, + {'item': 'Alien Plasma Gun IV', + 'recipee': [(1, 'Plasma Gun Prototype T4 Blueprint'), + (1, 'Plasma Gun IV'), + (1, 'Tungsten plate'), + (4, 'Screened battery'), + (50, 'Alien Monocrystal') + ]}, + {'item': 'Alien Plasma Gun V', + 'recipee': [(1, 'Plasma Gun Prototype T5 Blueprint'), + (1, 'Plasma Gun V'), + (3, 'Tungsten plate'), + (5, 'Screened battery'), + (70, 'Alien Monocrystal') + ]}, + # assault + {'item': 'Alien Assault Railgun III', + 'recipee': [(1, 'Assault Railgun Prototype T3 Blueprint'), + (1, 'Assault Railgun III'), + (6, 'Metal blank'), + (3, 'Screened battery'), + (30, 'Alien Monocrystal') + ]}, + {'item': 'Alien Assault Railgun IV', + 'recipee': [(1, 'Assault Railgun Prototype T4 Blueprint'), + (1, 'Assault Railgun IV'), + (1, 'Tungsten plate'), + (4, 'Screened battery'), + (50, 'Alien Monocrystal') + ]}, + {'item': 'Alien Assault Railgun V', + 'recipee': [(1, 'Assault Railgun Prototype T5 Blueprint'), + (1, 'Assault Railgun V'), + (3, 'Tungsten plate'), + (5, 'Screened battery'), + (70, 'Alien Monocrystal') + ]}, + # beam + {'item': 'Alien Beam Cannon III', + 'recipee': [(1, 'Beam Cannon Prototype T3 Blueprint'), + (1, 'Beam Cannon III'), + (6, 'Metal blank'), + (3, 'Screened battery'), + (30, 'Alien Monocrystal') + ]}, + {'item': 'Alien Beam Cannon IV', + 'recipee': [(1, 'Beam Cannon Prototype T4 Blueprint'), + (1, 'Beam Cannon IV'), + (1, 'Tungsten plate'), + (4, 'Screened battery'), + (50, 'Alien Monocrystal') + ]}, + {'item': 'Alien Beam Cannon V', + 'recipee': [(1, 'Beam Cannon Prototype T5 Blueprint'), + (1, 'Beam Cannon V'), + (3, 'Tungsten plate'), + (5, 'Screened battery'), + (70, 'Alien Monocrystal') + ]}, + # missiles + {'item': 'Doomsday Missile', + 'recipee': [(1, 'Doomsday Missile Blueprint'), + (2, 'Osmium crystals'), + (1, 'Computing chip'), + (1, 'Metal blank'), + ]}, + ] + + for ore in ORES: + fields = {'typ': 12, + 'tech': 0, + 'craftable': True, + } + fields.update(ore) + data.append({'model': 'scon.item', 'fields': fields}) + for mat in MATERIALS: + fields = {'typ': 13, + 'tech': 0, + 'craftable': True, + } + fields.update(mat) + data.append({'model': 'scon.item', 'fields': fields}) + + for ammo in AMMOS: + fields = {'typ': 8, + 'tech': 0, + 'craftable': True, + } + fields.update(ammo) + data.append({'model': 'scon.item', 'fields': fields}) + + for item in ITEMS: + fields = { + # items define typ and tech! + 'craftable': True, + } + fields.update(item) + data.append({'model': 'scon.item', 'fields': fields}) + + for item in ITEMS_NON_CRAFTING: + fields = { + # items define typ and tech! + 'craftable': False, + } + fields.update(item) + data.append({'model': 'scon.item', 'fields': fields}) + + for bluep in BLUEPRINTS: + fields = { + 'typ': 11, # blueprint + 'tech': 0, + 'craftable': True, + 'icon': 'blueprint', + } + fields.update(bluep) + data.append({'model': 'scon.item', 'fields': fields}) + + + build_pk_cache(data) + # now to the crafting recipees: + i = 1 # counter for crafting + j = 1 # counter for input + for craft in CRAFTING: + try: + crafting = {'model': 'scon.crafting', + 'pk': i, + 'fields': { 'output': lookup_pk(data, craft['item']), + 'amount': craft.get('amount', 1) }} + data.append(crafting) + primary = True + for amount, recipee in craft['recipee']: + crafting_input = {'model': 'scon.craftinginput', + 'pk': j, + 'fields': {'crafting': i, + 'item': lookup_pk(data, recipee), + 'amount': amount, + 'primary': primary} + } + primary = False + j = j + 1 + data.append(crafting_input) + i = i + 1 + except: + raise + + build_pk_cache(data) + return data + +if __name__ == "__main__": + fixes = generate_fixtures() + from pprint import pprint + pprint( fixes ) + # check pks: + for d in fixes: + if d.get('pk', None) is None: + print "%s is fail." % d + + write_fixture(fixes) \ No newline at end of file diff --git a/dj/scon/media/scon/icons/active_a1ma.png b/dj/scon/media/scon/icons/active_a1ma.png new file mode 100644 index 0000000..ecefa78 Binary files /dev/null and b/dj/scon/media/scon/icons/active_a1ma.png differ diff --git a/dj/scon/media/scon/icons/active_reverse_thruster.png b/dj/scon/media/scon/icons/active_reverse_thruster.png new file mode 100644 index 0000000..f793db0 Binary files /dev/null and b/dj/scon/media/scon/icons/active_reverse_thruster.png differ diff --git a/dj/scon/media/scon/icons/active_t5_engine_overcharge_pirate.png b/dj/scon/media/scon/icons/active_t5_engine_overcharge_pirate.png new file mode 100644 index 0000000..24b8414 Binary files /dev/null and b/dj/scon/media/scon/icons/active_t5_engine_overcharge_pirate.png differ diff --git a/dj/scon/media/scon/icons/active_t5_mass_shield_generator_pirate.png b/dj/scon/media/scon/icons/active_t5_mass_shield_generator_pirate.png new file mode 100644 index 0000000..842301a Binary files /dev/null and b/dj/scon/media/scon/icons/active_t5_mass_shield_generator_pirate.png differ diff --git a/dj/scon/media/scon/icons/active_t5_orion_targeting_complex_pirate.png b/dj/scon/media/scon/icons/active_t5_orion_targeting_complex_pirate.png new file mode 100644 index 0000000..e2ee3b0 Binary files /dev/null and b/dj/scon/media/scon/icons/active_t5_orion_targeting_complex_pirate.png differ diff --git a/dj/scon/media/scon/icons/ammo_attack_drone.png b/dj/scon/media/scon/icons/ammo_attack_drone.png new file mode 100644 index 0000000..bc12698 Binary files /dev/null and b/dj/scon/media/scon/icons/ammo_attack_drone.png differ diff --git a/dj/scon/media/scon/icons/ammo_doomsday_missile.png b/dj/scon/media/scon/icons/ammo_doomsday_missile.png new file mode 100644 index 0000000..003351f Binary files /dev/null and b/dj/scon/media/scon/icons/ammo_doomsday_missile.png differ diff --git a/dj/scon/media/scon/icons/ammo_double_deflector_mk4.png b/dj/scon/media/scon/icons/ammo_double_deflector_mk4.png new file mode 100644 index 0000000..5115530 Binary files /dev/null and b/dj/scon/media/scon/icons/ammo_double_deflector_mk4.png differ diff --git a/dj/scon/media/scon/icons/ammo_explosive_shells_mk4.png b/dj/scon/media/scon/icons/ammo_explosive_shells_mk4.png new file mode 100644 index 0000000..b909f25 Binary files /dev/null and b/dj/scon/media/scon/icons/ammo_explosive_shells_mk4.png differ diff --git a/dj/scon/media/scon/icons/ammo_focusing_lens.png b/dj/scon/media/scon/icons/ammo_focusing_lens.png new file mode 100644 index 0000000..4fcf0ca Binary files /dev/null and b/dj/scon/media/scon/icons/ammo_focusing_lens.png differ diff --git a/dj/scon/media/scon/icons/ammo_iridium_slugs.png b/dj/scon/media/scon/icons/ammo_iridium_slugs.png new file mode 100644 index 0000000..cd65202 Binary files /dev/null and b/dj/scon/media/scon/icons/ammo_iridium_slugs.png differ diff --git a/dj/scon/media/scon/icons/ammo_supercooled_charges.png b/dj/scon/media/scon/icons/ammo_supercooled_charges.png new file mode 100644 index 0000000..a167d5a Binary files /dev/null and b/dj/scon/media/scon/icons/ammo_supercooled_charges.png differ diff --git a/dj/scon/media/scon/icons/ammo_xenon_lamp_mk4.png b/dj/scon/media/scon/icons/ammo_xenon_lamp_mk4.png new file mode 100644 index 0000000..553c6a8 Binary files /dev/null and b/dj/scon/media/scon/icons/ammo_xenon_lamp_mk4.png differ diff --git a/dj/scon/media/scon/icons/blueprint.png b/dj/scon/media/scon/icons/blueprint.png new file mode 100644 index 0000000..a44c675 Binary files /dev/null and b/dj/scon/media/scon/icons/blueprint.png differ diff --git a/dj/scon/media/scon/icons/component_alien_monocrystal.png b/dj/scon/media/scon/icons/component_alien_monocrystal.png new file mode 100644 index 0000000..0ea8b3d Binary files /dev/null and b/dj/scon/media/scon/icons/component_alien_monocrystal.png differ diff --git a/dj/scon/media/scon/icons/component_computing_chip.png b/dj/scon/media/scon/icons/component_computing_chip.png new file mode 100644 index 0000000..6f8f290 Binary files /dev/null and b/dj/scon/media/scon/icons/component_computing_chip.png differ diff --git a/dj/scon/media/scon/icons/component_metal_blank.png b/dj/scon/media/scon/icons/component_metal_blank.png new file mode 100644 index 0000000..150bb8b Binary files /dev/null and b/dj/scon/media/scon/icons/component_metal_blank.png differ diff --git a/dj/scon/media/scon/icons/component_osmium_crystals.png b/dj/scon/media/scon/icons/component_osmium_crystals.png new file mode 100644 index 0000000..50418c2 Binary files /dev/null and b/dj/scon/media/scon/icons/component_osmium_crystals.png differ diff --git a/dj/scon/media/scon/icons/component_processing_block.png b/dj/scon/media/scon/icons/component_processing_block.png new file mode 100644 index 0000000..b0b59d6 Binary files /dev/null and b/dj/scon/media/scon/icons/component_processing_block.png differ diff --git a/dj/scon/media/scon/icons/component_pure_silicon.png b/dj/scon/media/scon/icons/component_pure_silicon.png new file mode 100644 index 0000000..d388d7c Binary files /dev/null and b/dj/scon/media/scon/icons/component_pure_silicon.png differ diff --git a/dj/scon/media/scon/icons/component_screened_battery.png b/dj/scon/media/scon/icons/component_screened_battery.png new file mode 100644 index 0000000..ac1e7b8 Binary files /dev/null and b/dj/scon/media/scon/icons/component_screened_battery.png differ diff --git a/dj/scon/media/scon/icons/component_tungsten_plate.png b/dj/scon/media/scon/icons/component_tungsten_plate.png new file mode 100644 index 0000000..ef03e88 Binary files /dev/null and b/dj/scon/media/scon/icons/component_tungsten_plate.png differ diff --git a/dj/scon/media/scon/icons/cpu_target_tracking_coprocessor.png b/dj/scon/media/scon/icons/cpu_target_tracking_coprocessor.png new file mode 100644 index 0000000..82d05ea Binary files /dev/null and b/dj/scon/media/scon/icons/cpu_target_tracking_coprocessor.png differ diff --git a/dj/scon/media/scon/icons/duplicator.png b/dj/scon/media/scon/icons/duplicator.png new file mode 100644 index 0000000..e1e2851 Binary files /dev/null and b/dj/scon/media/scon/icons/duplicator.png differ diff --git a/dj/scon/media/scon/icons/resource_crystal_shard.png b/dj/scon/media/scon/icons/resource_crystal_shard.png new file mode 100644 index 0000000..b94394f Binary files /dev/null and b/dj/scon/media/scon/icons/resource_crystal_shard.png differ diff --git a/dj/scon/media/scon/icons/resource_osmium_ore.png b/dj/scon/media/scon/icons/resource_osmium_ore.png new file mode 100644 index 0000000..d2d3cdc Binary files /dev/null and b/dj/scon/media/scon/icons/resource_osmium_ore.png differ diff --git a/dj/scon/media/scon/icons/resource_silicon_ore.png b/dj/scon/media/scon/icons/resource_silicon_ore.png new file mode 100644 index 0000000..35e4ff3 Binary files /dev/null and b/dj/scon/media/scon/icons/resource_silicon_ore.png differ diff --git a/dj/scon/media/scon/icons/resource_tungsten_ore.png b/dj/scon/media/scon/icons/resource_tungsten_ore.png new file mode 100644 index 0000000..43f8e1a Binary files /dev/null and b/dj/scon/media/scon/icons/resource_tungsten_ore.png differ diff --git a/dj/scon/media/scon/icons/resource_vanadium.png b/dj/scon/media/scon/icons/resource_vanadium.png new file mode 100644 index 0000000..a2a4eeb Binary files /dev/null and b/dj/scon/media/scon/icons/resource_vanadium.png differ diff --git a/dj/scon/media/scon/icons/weapon_assault_rail_mk5.png b/dj/scon/media/scon/icons/weapon_assault_rail_mk5.png new file mode 100644 index 0000000..7219d85 Binary files /dev/null and b/dj/scon/media/scon/icons/weapon_assault_rail_mk5.png differ diff --git a/dj/scon/media/scon/icons/weapon_beam_cannon_mk5.png b/dj/scon/media/scon/icons/weapon_beam_cannon_mk5.png new file mode 100644 index 0000000..2e905c7 Binary files /dev/null and b/dj/scon/media/scon/icons/weapon_beam_cannon_mk5.png differ diff --git a/dj/scon/media/scon/icons/weapon_plasma_gun_mk5.png b/dj/scon/media/scon/icons/weapon_plasma_gun_mk5.png new file mode 100644 index 0000000..1c672f0 Binary files /dev/null and b/dj/scon/media/scon/icons/weapon_plasma_gun_mk5.png differ diff --git a/dj/scon/models.py b/dj/scon/models.py index 71a8362..77569e0 100644 --- a/dj/scon/models.py +++ b/dj/scon/models.py @@ -1,3 +1,117 @@ from django.db import models +from django.utils.text import slugify +ITEM_TYPES = ( + (0, 'Misc'), + (1, 'Engine'), + (2, 'Capacitor'), + (3, 'Shield'), + (4, 'Hull'), + (5, 'Cpu'), + (6, 'Active'), + (7, 'Weapon'), + (8, 'Ammo'), + (9, 'Missile'), + (10, 'Class'), + (11, 'Blueprint'), + (12, 'Resource'), + (13, 'Component'), + ) + +QUALITY_TYPES = ( + (0, '-'), + (1, 'Mk1'), + (2, 'Mk2'), + (3, 'Mk3'), + (4, 'Mk4'), + (5, 'Mk5'), + (10, 'Universal'), + (14, 'Pirate Mk4'), + ) +D_QUALITY = dict(QUALITY_TYPES) + +TECH_TYPES = ( + (0, ''), + (1, 'I'), + (2, 'II'), + (3, 'III'), + (4, 'IV'), + (5, 'V'), + ) + +ROLE_TYPES = ( + (-1, ''), + (0, 'Multipurpose'), + (1, 'Recon'), + (2, 'ECM'), + (3, 'Covert Ops'), + (4, 'Tackler'), + (5, 'Command'), + (6, 'Gunship'), + (7, 'Engineer'), + (8, 'Guard'), + (9, 'Longrange') + ) # Create your models here. +class Item(models.Model): + name = models.CharField(max_length=128) + description = models.TextField(blank=True, null=True) + tech = models.IntegerField(default=0, blank=True) + quality = models.IntegerField(default=0, blank=True, choices=QUALITY_TYPES) + icon = models.CharField(max_length=128, blank=True, null=True) + typ = models.IntegerField(default=0, choices=ITEM_TYPES) + craftable = models.BooleanField(default=False, blank=True) + sell_price = models.IntegerField(default=0, blank=True) + buy_price = models.IntegerField(default=0, blank=True) + buy_price_premium = models.IntegerField(default=0, blank=True) + + role = models.IntegerField(default=-1, blank=True) + + def save(self, *args, **kwargs): + if self.icon is None or self.icon == '': + if self.typ>0: + item_types = dict(ITEM_TYPES) + try: + s = item_types[self.typ] + s = s.lower() + except: + s = 'unknown' + self.icon = '%s_t%s_%s' % (s, self.tech, slugify(self.name)) + else: + self.icon = 't%s_%s' % (self.tech, slugify(self.name)) + return super(Item, self).save(*args, **kwargs) + + def primary_recipee(self): + f=CraftingInput.objects.filter(primary=True, item=self) + if len(f) == 1: + return f[0].crafting + + def crafting_used_in(self): + return CraftingInput.objects.filter(item=self) + + def __unicode__(self): + if self.quality: + return '%s (%s)' % (self.name, D_QUALITY.get(self.quality, '')) + return '%s' % (self.name,) + + +class Crafting(models.Model): + output = models.ForeignKey(Item, related_name='crafting') + amount = models.IntegerField(default=1, blank=True) + input = models.ManyToManyField(Item, related_name='recipees', through='CraftingInput') + + def ingredients(self): + return CraftingInput.objects.filter(crafting=self) + + def __unicode__(self): + return 'Recipee for %s' % (self.output.name,) + +class CraftingInput(models.Model): + crafting = models.ForeignKey(Crafting) + item = models.ForeignKey(Item) + amount = models.IntegerField(default=1) + primary = models.BooleanField(default=False, blank=True) + + def __unicode__(self): + return 'Part of Recipee for %s (x%s): %s (x%s)' % (self.crafting.output, self.crafting.amount, self.item, self.amount) + diff --git a/dj/scon/templates/scon/base.html b/dj/scon/templates/scon/base.html index 730d1e5..8c1d015 100644 --- a/dj/scon/templates/scon/base.html +++ b/dj/scon/templates/scon/base.html @@ -1 +1,61 @@ {% extends "base.html" %} + +{% block css %} + +{% endblock css %} \ No newline at end of file diff --git a/dj/scon/templates/scon/crafting/overview.html b/dj/scon/templates/scon/crafting/overview.html new file mode 100644 index 0000000..f0bf1db --- /dev/null +++ b/dj/scon/templates/scon/crafting/overview.html @@ -0,0 +1,60 @@ +{% extends "scon/base.html" %} + +{% block context %} + +

Star Conflict Crafting Cheat Sheet

+ + + + + + + + + + + {% for item in items %} + {% if item.primary_recipee %} + + + {% with item.primary_recipee as recipee %} + + + + {% endwith %} + + {% endif %} + {% endfor %} + +
Name Crafts toAlso used in Crafting
+
+ {% if item.icon %}{% endif %} {{ item.name }} + {% if item.sell_price %}
Sell: {{item.sell_price}} cr{% endif %} +
+
+
{% if recipee.amount > 1 %}{{ recipee.amount }}{% endif %}
+
+
+ {% if recipee.output.icon %}{% endif %} {{ recipee.output }} + {% if recipee.output.sell_price %}
Sell: {{recipee.output.sell_price}} cr{% endif %} +
+
+
    + {% for ingredient in recipee.ingredients %} +
  • {{ ingredient.item.name }} x {{ ingredient.amount }}
  • + {% endfor %} +
+
+
+
    + {% for i1 in item.crafting_used_in %} + {% with i1.crafting.output as ci %} +
  • {{ ci.name }}
  • + {% for i2 in ci.crafting_used_in %} +
  • {{ i2.crafting.output.name }} ({{ci.name}})
  • + {% endfor %} + {% endwith %} + {% endfor %} +
+
+{% endblock context %} \ No newline at end of file diff --git a/dj/scon/views.py b/dj/scon/views.py index 3e86048..7864a18 100644 --- a/dj/scon/views.py +++ b/dj/scon/views.py @@ -3,8 +3,17 @@ from django.shortcuts import render from django.http import HttpResponse from django.template import RequestContext, loader import logic +import models def config(request): t = loader.get_template('scon/config.html') c = RequestContext(request, logic.config({'title': 'Configure your Client'})) return HttpResponse(t.render(c)) + +def crafting(request): + t = loader.get_template('scon/crafting/overview.html') + items = models.Item.objects.filter(craftable=True) + tree = None + c = RequestContext(request, {'tree': tree, + 'items': items}) + return HttpResponse(t.render(c)) \ No newline at end of file diff --git a/dj/settings.py b/dj/settings.py index f6c3a61..104f199 100644 --- a/dj/settings.py +++ b/dj/settings.py @@ -36,6 +36,14 @@ INSTALLED_APPS = ( 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', + 'dj.scon', +) + +TEMPLATE_CONTEXT_PROCESSORS = ( + "django.core.context_processors.request", + "django.contrib.auth.context_processors.auth", + "django.core.context_processors.media", + "django.core.context_processors.static", ) MIDDLEWARE_CLASSES = ( @@ -47,7 +55,7 @@ MIDDLEWARE_CLASSES = ( 'django.middleware.clickjacking.XFrameOptionsMiddleware', ) -ROOT_URLCONF = 'scon.dj.urls' +ROOT_URLCONF = 'dj.urls' WSGI_APPLICATION = 'dj.wsgi.application' @@ -80,6 +88,8 @@ USE_TZ = True # https://docs.djangoproject.com/en/1.6/howto/static-files/ STATIC_URL = '/static/' +MEDIA_URL = '/media/' +MEDIA_ROOT = r'D:\work\workspace\scon\src\scon\dj\scon\media' DEJAQT_DIRS = { STATIC_URL: '', diff --git a/dj/urls.py b/dj/urls.py index fd424c2..6bf97fa 100644 --- a/dj/urls.py +++ b/dj/urls.py @@ -1,5 +1,5 @@ from django.conf.urls import patterns, include, url - +from django.conf import settings from django.contrib import admin admin.autodiscover() @@ -8,5 +8,12 @@ urlpatterns = patterns('', # url(r'^$', 'dj.views.home', name='home'), # url(r'^blog/', include('blog.urls')), url(r'^admin/', include(admin.site.urls)), - #url(r'^scon/', include('scon.urls')), + url(r'^crafting/', 'dj.scon.views.crafting', name='scon_crafting'), ) + +if settings.DEBUG : + urlpatterns += patterns('', + (r'^media/(?P.*)$', 'django.views.static.serve', + {'document_root': settings.MEDIA_ROOT, 'show_indexes': True}), + + ) \ No newline at end of file