def callback_c(n, durationValue, amountValue, rvValue, scheduleRows, modeValue,
               rateValue, **kwargs):
    user = kwargs['user']
    if n is None:
        user = kwargs['user']
        return [
            html.Div('Lease quote', className='h3 mb-0'),
            dbc.Button("Save quote",
                       id="save_quote_button",
                       className="d-none d-md-block btn btn-sm btn-primary"),
        ]

        return dash.no_update
    else:
        if n > 1:
            return [
                html.Div('Lease quote', className='h3 mb-0'),
            ]
        customer = get_object_or_404(Customer, pk=1)
        contract = Contract()
        contract.customer = customer
        contract.user = user
        contract.status = 'Created'
        contract.creation_date = datetime.date.today()
        contract.status_date = datetime.date.today()
        contract.save()
        schedule = Schedule()
        schedule.contract = contract
        schedule.mode = modeValue
        schedule.rv = rvValue
        schedule.amount = amountValue
        schedule.start_date = startdate
        schedule.rate = rateValue / 120000

        schedule.save()
        i = 0
        for scheduleRow in scheduleRows:
            if (modeValue == '01'):
                date = startdate + relativedelta(months=i)
            else:
                date = startdate + relativedelta(months=i + 1)
            i = i + 1
            step = Step()
            step.schedule = schedule
            step.rent = scheduleRow['rent']
            step.balance = scheduleRow['balance']
            step.date = date
            step.save()

        return [
            html.Div('Lease quote', className='h3 mb-0 text-gray-800'),
            html.Div('Quote saved !', className='h3 mb-0 text-gray-800'),
        ]
Пример #2
0
    def _save_schedule(self, schedule: Schedule):
        t = datetime.datetime.now().strftime('%Y-%m-%dT%H-%M-%S')

        fname = os.path.join(
            os.getcwd(), "data/schedules", f"sch-str-{t}.csv")
        with open(fname, "w") as f:
            f.write(schedule.to_csv())
        self._logger.write(
            f"\nHuman Readable Schedule successfully saved to: {fname}")

        fname = os.path.join(
            os.getcwd(), "data/schedules", f"sch-num-{t}.csv")
        with open(fname, "w") as f:
            f.write(schedule.to_num_csv())
        self._logger.write(
            f"Numeric Schedule successfully saved to: {fname}")
Пример #3
0
	def is_name_unique(self, name):
		schedules = Schedule.all()
		schedules.filter('owner =', users.get_current_user());
		schedules.filter('name =', name)
		
		if (schedules.count() > 0):
			return False		

		return True
Пример #4
0
	def create_schedule(self, name):
		profile = profiles.get_user_profile_from_ds()
		schedule = Schedule(parent=profile)
		schedule.name = name
		schedule.owner = users.get_current_user()
		schedule.term = 1
		schedule.year = 2011
		schedule.put()
		return schedule
Пример #5
0
    def save(self):
        schedule_code = self.cleaned_data['file'].read()
        parser = ScheduleParser()

        schedule = parser.parse(schedule_code)

        with transaction.commit_on_success():
            t = Trigger.objects.get(method__name=schedule['trigger_method'], method__interface__name=schedule['trigger_interface'])

            s = Schedule(trigger=t, name=schedule['schedule_name'], schedule_file=self.cleaned_data['file'])
            s.save()

            for action in schedule['actions']:
                a = Action.objects.get(name=action['action_name'])
                sa = ScheduleAction(schedule=s, action=a)

                if action['trigger_from'] != None:
                    ad = ActionDevice.objects.get(action=a, parameter_position=action['trigger_from'])
                    sa.trigger_device = ad
                sa.save()
Пример #6
0
	def get_schedule_by_name(self, scheduleName):
		schedules = Schedule.all()
		schedules.filter('owner =', users.get_current_user());
		schedules.filter('name =', scheduleName)
		
		if schedules.count() == 0:
			return None
		
		# Schedules should have unique names, so...
		for schedule in schedules:
			return schedule
Пример #7
0
 def test_saving_and_retrieving_schedule(self):
     schedule1 = Schedule(event="New",
                          start_time=datetime.time(11, 23, 44),
                          end_time=datetime.time(11, 25, 44))
     schedule1.save()
     schedule2 = Schedule(event="Next",
                          start_time=datetime.time(8, 11, 10),
                          end_time=datetime.time(8, 25, 12))
     schedule2.save()
     saved_schedule = Schedule.objects.all()
     self.assertEqual(saved_schedule.count(), 2)
     self.assertEqual(saved_schedule[0], schedule1)
     self.assertEqual(saved_schedule[1], schedule2)
Пример #8
0
    def generate(self) -> Schedule:
        classes = []

        for C in self.schedule_param.courses:
            assigned_instructors = self._get_assigned_Instructors_for(
                C, )

            for sec_i in range(C.num_of_sections):
                instructor, timeslot, room = self._get_unique_Instr_Timeslot_Room(
                    assigned_instructors, C, classes, )

                section = Section(C, sec_i+1)
                classes.append(Class(section, instructor, room, timeslot))

        return Schedule(classes)
Пример #9
0
	def get_user_schedules(self):
		schedules = Schedule.all()
		schedules.filter('owner =', users.get_current_user())
		schedules.order('creationDate')
		schedList = []
		
		for schedule in schedules:
			toSend = {}
			toSend['name'] = cgi.escape(schedule.name)
			toSend['nameB64'] = base64.b64encode(schedule.name)
			toSend['courseCount'] = schedule.course_set.count()
			toSend['year'] = schedule.year
			toSend['term'] = schedule.term
			toSend['key'] = str(schedule.key())
			schedList.append(toSend)
		
		return schedList
Пример #10
0
    def run(self, *args, **kwargs):
        # initial population
        population = [
            self.schedule_generator.generate()
            for _ in range(self.population_size)
        ]
        new_population = [None for _ in range(self.population_size)]

        total_classes = len(self.schedule_param.sections)
        self.logger.write(self.logger.record_start_marker)

        for epoch in range(self.epochs):
            try:
                population = sorted(
                    population,
                    key=lambda sch: self.fitness_provider.fitness(sch),
                    reverse=not self.fitness_provider.is_reverse())

                best_fitness = self.fitness_provider.fitness(population[0])
                self.logger.write(f"{epoch}\t\t{best_fitness}")

                if self.fitness_provider.compare(best_fitness,
                                                 self.min_acceptable_fitness):
                    return population[0]
                """ Dominance by elites """
                elite_count = (self.elite_pct * self.population_size) // 100
                for i in range(elite_count):
                    new_population[i] = population[i]
                """ Crossover """
                mateable_count = (self.mateable_pct *
                                  self.population_size) // 100
                siblig_index = 1 \
                    if (self.population_size - elite_count) % 2 == 0 \
                    else -1
                for i in range(elite_count, self.population_size, 2):
                    parent1_idx = np.random.randint(mateable_count)
                    parent2_idx = np.random.randint(mateable_count)

                    # single point crossover
                    crossover_point = np.random.randint(total_classes)

                    # 2 children produced
                    new_population[i + siblig_index] = Schedule(
                        (population[parent1_idx].classes[:crossover_point] +
                         population[parent2_idx].classes[crossover_point:]))
                    new_population[i] = Schedule(
                        (population[parent2_idx].classes[:crossover_point] +
                         population[parent1_idx].classes[crossover_point:]))
                """ Mutation """
                # self.mutable_pct
                mutable_count = (self.mutable_pct *
                                 self.population_size) // 100
                for i in range(mutable_count):
                    # NOTE: research on optimal choice of `schedule_idx` range
                    schedule_idx = np.random.randint(self.population_size)
                    # schedule_idx = np.random.randint(elite_count, population_size)

                    class_idx = np.random.randint(total_classes)

                    param_idx = np.random.randint(3)

                    tmp_sch = deepcopy(new_population[schedule_idx])

                    if param_idx == 0:
                        """ mutate room """
                        tmp_sch.classes[class_idx].room = random.choice(
                            self.schedule_param.rooms)
                    elif param_idx == 1:
                        """ mutate instructor """
                        tmp_sch.classes[class_idx].instructor = \
                            random.choice(self.schedule_param.instructors)
                    else:  # param_idx == 2
                        """ mutate timeslot """
                        tmp_sch.classes[class_idx].timeslot = \
                            random.choice(self.schedule_param.timeslots)

                    new_population[schedule_idx] = tmp_sch
                """ Local Search using Smart Mutation """
                lcl_search_count = (self.lcl_search_pct *
                                    self.population_size) // 100
                for i in range(lcl_search_count):
                    schedule_idx = np.random.randint(self.population_size)
                    class_idx = np.random.randint(total_classes)

                    tmp_sch = deepcopy(new_population[schedule_idx])

                    for j in range(self.lcl_search_iters):
                        param_idx = np.random.randint(3)

                        if param_idx == 0:
                            """ mutate room """
                            tmp_sch.classes[class_idx].room = random.choice(
                                self.schedule_param.rooms)
                        elif param_idx == 1:
                            """ mutate instructor """
                            tmp_sch.classes[class_idx].instructor = \
                                random.choice(self.schedule_param.instructors)
                        else:  # param_idx == 2
                            """ mutate timeslot """
                            tmp_sch.classes[class_idx].timeslot = \
                                random.choice(self.schedule_param.timeslots)

                        tmp_fitness = self.fitness_provider.fitness(tmp_sch)
                        current_fitness = self.fitness_provider.fitness(
                            new_population[schedule_idx])

                        if self.fitness_provider.compare(
                                tmp_fitness, current_fitness):
                            new_population[schedule_idx] = tmp_sch
                            break

                population = new_population
            except KeyboardInterrupt:
                print("Solver stopped by user")
                break

        self.logger.write(self.logger.record_end_marker)

        best_fitness = self.fitness_provider.fitness(population[0])
        best_fit_idx = 0
        for i in range(1, len(population)):
            f = self.fitness_provider.fitness(population[i])
            if self.fitness_provider.compare(f, best_fitness):
                best_fitness = f
                best_fit_idx = i

        return population[best_fit_idx]
Пример #11
0
 def setUp(self):
     import datetime
     schedule1 = Schedule(event="New",
                          start_time=datetime.time(11, 23),
                          end_time=datetime.time(11, 25))
     schedule1.save()