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 %}
+
+
Name | ++ | Crafts to | +Also used in Crafting | +
---|---|---|---|
+
+ {% if item.icon %}
+ ![]() Sell: {{item.sell_price}} cr{% endif %} + |
+ {% with item.primary_recipee as recipee %}
+
+ {% if recipee.amount > 1 %}{{ recipee.amount }}{% endif %}
+ |
+
+
+ {% if recipee.output.icon %}
+ ![]() Sell: {{recipee.output.sell_price}} cr{% endif %} +
+
+
|
+
+
|
+ {% endwith %}
+