Exemplo n.º 1
0
    def delete_dataset_post(self):
        """
        Deletes a dataset specified by the request id
        """

        try:
            session = self.acquire_sql_session()
        except:
            traceback.print_exc()
            raise HTTPError(500, 'Could not acquire database session.')

        try:
            id = int(self.get_argument('id'))

            dataset = DatasetRepository.get_by_id(session, id)
            problem_id = dataset.problem_id

            session.delete(dataset)
            session.commit()

            # Update the problem's default dataset if necessary
            try:
                ProblemRepository.update_default_dataset(session, problem_id)
                session.commit()
            except SQLAlchemyError:
                raise

        except Exception as e:
            traceback.print_exc()
            raise HTTPError(400)

        finally:
            session.close()

        self.write('Success!')
Exemplo n.º 2
0
    def create_dataset_post(self):
        """
        Creates a new dataset, using the arguments from
        the post request
        """

        # Get arguments from request
        try:
            problem_id = int(self.get_argument('problem-id'))
            name = self.get_argument('name')
            time_limit = self.get_argument('time-limit')
            memory_limit = self.get_argument('memory-limit')

            # If received empty string, use database default
            try:
                time_limit = float(time_limit) if time_limit else None
                memory_limit = float(memory_limit) if memory_limit else None

                # Validate time and memory limits
                if not self.validate_time_memory(time_limit, memory_limit):
                    raise HTTPError(400, 'Invalid time limit or memory limit')

            except:
                raise HTTPError(400, 'Invalid time limit '
                                     'or memory limit format')

            stdin = self.get_argument('stdin', '')
            stdout = self.get_argument('stdout', '')

            # Get uploaded testcases
            files = self.request.files
            testcases = files.get('testcases', None)

            if testcases is not None:
                testcases_dict = testcases[0]
                testcases_body = testcases_dict['body']
            else:
                testcases_body = None

        except HTTPError:
            raise  # Re-raise exception

        except Exception as e:
            traceback.print_exc()
            raise HTTPError(400)  # Bad request

        try:
            session = self.acquire_sql_session()
        except:
            traceback.print_exc()
            raise HTTPError(500, 'Could not acquire database session.')

        try:
            # Create a new empty dataset (in order to get an ID)
            new_dataset = self.create_empty_dataset(memory_limit,
                                                    name,
                                                    problem_id,
                                                    time_limit,
                                                    stdin,
                                                    stdout,
                                                    session
                                                    )
            # Extract testcases_body
            extracted = self.extract_zip(testcases_body)

            # Go through files and construct testcases
            self.create_testcases(extracted, new_dataset, session)

            # Commit changes (add testcases)
            session.commit()
        except HTTPError:
            traceback.print_exc()
            raise

        except Exception as e:
            traceback.print_exc()
            raise HTTPError(400)

        finally:
            session.rollback()

        # Update the problem's default dataset, if necessary
        try:
            ProblemRepository.update_default_dataset(session, problem_id)
            session.commit()
        except SQLAlchemyError:
            raise

        self.redirect('/problem/edit?name=' + new_dataset.problem.name)
        session.close()