Esempio n. 1
0
    def save_new_scenario_data(self, request):
        # Create initial scenario
        # Create initial scenario
        # Create initial scenario
        adapter = EMOD_Adapter(request.user.username)

        emod_scenario = EMODBaseline(
            name='',
            description='Made with representative workflow',
            model=DimModel.objects.get(model='EMOD'),
            user=DimUser.objects.get_or_create(username=request.user.username)[0]
        )

        template_object = DimTemplate.objects.get(template_name="Representative Location")

        emod_scenario.model_version = template_object.model_version
        emod_scenario.template_id = 21
        emod_scenario.template = template_object

        # Create and add a config file
        config_json = json.loads(template_object.get_file_content('config.json'))
        emod_scenario.add_file_from_string('config', 'config.json', json.dumps(config_json), description='SOMETHING')

        # populate campaign
        try:
            campaign = json.loads(template_object.get_file_content('campaign.json'))
        except KeyError:
            # use empty campaign file
            campaign = json.loads({"Events": []})

        # Add the emod_scenario campaign file
        emod_scenario.add_file_from_string('campaign', 'campaign.json', json.dumps(campaign), description='SOMETHING')

        emod_scenario.save()
        # Create initial scenario
        # Create initial scenario
        # Create initial scenario

        # Hack until I know how to retrieve files from DimBaseline without funneling it through EMODBaseline
        dim_scenario = DimBaseline.objects.get(id=emod_scenario.id)

        # Add metadata
        current_metadata = {}
        current_metadata['representative'] = {}

        # Fill data
        current_metadata['representative']['steps_complete'] = step_number + 1
        current_metadata['representative']['is_complete'] = False
        current_metadata['representative']['is_editable'] = True
        dim_scenario.metadata = json.dumps(current_metadata)

        dim_scenario.save()

        print "Scenario ID = " + str(emod_scenario.id)

        return emod_scenario.id
    def done(self, form_list, **kwargs):
        """A method that processes all the form data at the end of Wizard

        Save collected data from multiple forms into one DB table (Baseline)
        """

        adapter = EMOD_Adapter(self.request.user.username)

        # populate new scenario with template data
        template_id = self.storage.get_step_data("location")["location-template_id"]
        my_name = self.storage.get_step_data("location")["location-name"]
        my_description = self.storage.get_step_data("location")["location-description"]

        # create a new scenario
        my_scenario = EMODBaseline(
            name=my_name,
            description=my_description,
            model=DimModel.objects.get(model="EMOD"),
            user=DimUser.objects.get_or_create(username=self.request.user.username)[0],
        )

        my_template_obj = DimTemplate.objects.get(id=template_id)

        my_scenario.model_version = my_template_obj.model_version
        my_scenario.template_id = template_id
        my_scenario.template = my_template_obj

        my_scenario.save()

        # populate config
        template_config = ast.literal_eval(my_template_obj.get_file_content("config.json"))
        my_scenario_config = copy.deepcopy(template_config)
        # save the scenario config file
        my_scenario.add_file_from_string(
            "config", "config.json", str(my_scenario_config), description=self.steps.current
        )

        # populate campaign
        try:
            template_campaign = ast.literal_eval(my_template_obj.get_file_content("campaign.json"))
            my_campaign = str(copy.deepcopy(template_campaign))
        except KeyError:
            # use empty campaign file
            my_campaign = str({"Events": []})

        # save the scenario config file
        my_scenario.add_file_from_string("campaign", "campaign.json", my_campaign, description=self.steps.current)

        #########################
        ### Add default files to scenario

        # todo: stop using template zips, when climate files are available elsewhere
        # print my_template_obj.climate_url

        my_location_zip_link = my_template_obj.climate_url

        # Do we cache zip to temp dir first time, and always access them from there (if they exist)
        # FILE_UPLOAD_TEMP_DIR
        # setup work directory
        # my_directory = os.path.join(settings.MEDIA_ROOT, 'uploads/expert_emod/')
        # my_directory = os.path.join(FILE_UPLOAD_TEMP_DIR, 'ts_emod/')
        # if not os.path.exists(my_directory):
        #    os.makedirs(my_directory)

        # inStream = urllib2.urlopen('http://dl-vecnet.crc.nd.edu/downloads/wh246s153')
        # inStream = urllib2.urlopen('https://dl.vecnet.org/downloads/wh246s153')
        if settings.DEBUG is True:
            now = datetime.datetime.now()
            print now, " DEBUG: getting zip file: ", my_location_zip_link
        url = urlopen(my_location_zip_link)
        zipfile = ZipFile(StringIO(url.read()))

        for zip_file_name in zipfile.namelist():
            if settings.DEBUG is True:
                now = datetime.datetime.now()
                print now, " DEBUG: handling file: ", zip_file_name
            my_file = zipfile.open(zip_file_name)
            my_name = ntpath.basename(zip_file_name)

            # determine which file type this is
            # my_name contains 'demographics' ?  (use compiled, store both?)
            # Honiara_demographics.static.compiled.json Honiara_demographics.json
            """
            'air binary',
            'air json',
            'humidity binary',
            'humidity json',
            'land_temp binary',
            'land_temp json',
            'rainfall binary',
            'rainfall json',

            Honiara_demographics.compiled.json
            Honiara_demographics.json
            Honiara_demographics.static.compiled.json
            Honiara_demographics.static.json
            Honiara_humidity_daily10y.bin
            Honiara_humidity_daily10y.bin.json
            Kenya_Nyanza_2.5arcminhumid_1365118879_climateheader.json
            Honiara_rainfall_daily10y.bin
            Honiara_rainfall_daily10y.bin.json
            Honiara_temperature_daily10y.bin
            Honiara_temperature_daily10y.bin.json
            """
            my_type = None
            if ".md5" in my_name:
                continue
            elif "demographics" in my_name or "Demographics" in my_name:
                if "compiled" in my_name:
                    # use in scenario
                    my_type = "demographics"
                else:
                    # save to storage (to allow user to see contents)
                    self.storage.extra_data["demographics"] = my_file
            elif ".json" in my_name and ".json.bin" not in my_name:
                # 'json' files
                if "humid" in my_name:
                    my_type = "humidity json"
                elif "rain" in my_name:
                    my_type = "rainfall json"
                elif "temp" in my_name or "tmean" in my_name:
                    my_type = "air json"
            else:
                # must be a binary file
                if "humid" in my_name:
                    my_type = "humidity binary"
                elif "rain" in my_name:
                    my_type = "rainfall binary"
                elif "temp" in my_name or "tmean" in my_name:
                    my_type = "air binary"

            if my_type is not None:
                if "binary" in my_type:
                    my_scenario.add_file_from_string(my_type, my_name, my_file.read(), description=self.steps.current)
                else:
                    my_scenario.add_file_from_string(my_type, my_name, my_file.read(), description=self.steps.current)

                # todo: fix to allow separate air and land temp files
                # for now: use same files for air temp and land temp
                if my_type in ("air binary", "air json"):
                    my_type = my_type.replace("air", "land_temp")
                    my_scenario.add_file_from_string(
                        my_type, my_name, "no land temp file", description=self.steps.current
                    )
        ###  END Zip/Input File handling
        ######################

        try:
            my_id, completed = my_scenario.save()
            set_notification("alert-success", "The simulation was saved. ", self.request.session)

            # todo: add folder stuff to adapter/EMODBaseline (instead, for now get/save object)
            # #6574 - add the folder that owns this scenario
            if self.storage.get_step_data("location")["folder_id"] != "":
                # see todo: my_scenario.folder = int(self.storage.get_step_data('location')['folder_id'])
                temp = DimBaseline.objects.get(pk=my_scenario.id)
                temp.folder = Folder.objects.get(pk=int(self.storage.get_step_data("location")["folder_id"]))
                temp.save()

        except KeyError:
            set_notification("alert-error", "Error: The simulation was not saved. ", self.request.session)

        # check if user wants to launch, or just save
        if (
            "edit" in self.storage.data["step_data"]["location"]
            and self.storage.data["step_data"]["location"]["edit"][0] == "1"
        ):
            edit_flag = True
        else:
            edit_flag = False

        # clear out saved form data.
        self.storage.reset()

        if edit_flag:
            return redirect("ts_edit_step", step="config", scenario_id=str(my_id))
        else:
            return redirect("ts_emod_scenario_details", scenario_id=my_id)