예제 #1
0
    def sendMail(self):
        """
            Send the mail via the Gmail server.
            Note, due to an unknown reason, the yagmail library can't send
            zipfiles.  Therefore the code has been changed to send each png file.
            Code adapted on 11/01/2020
        """
        # Zip the files
        # result = makezip(self._scan_base_folder, self._defaultZipFileName, self._lastIndexOfMail)
        result = Get_png_images(self._scan_base_folder + os.sep +
                                str(self._lastIndexOfMail))
        print(result)
        mg = GmailClient(receiver=self.txtTo.text(),
                         body=self.txtBody.toPlainText(),
                         subject=self.txtSubject.text(),
                         files=result,
                         gmail_key=self._gmailappkey)

        try:
            mg.sendGMail()
            session = Session()
            x = session.query(MailBox).get(self._lastIndexOfMail)
            # Set sent date and time
            x.date_sent = datetime.datetime.now()
            session.commit()
            logging.info(
                f"Mail sent and updated record {self._lastIndexOfMail}")
        except MailSendError as err:
            MsgBox.show("Probleem!", QMessageBox.Critical, "Fout",
                        "Email niet verzonden!", QMessageBox.Ok)
            logging.error(f"Unable to send mail {err.msg} {err.destination}")
예제 #2
0
 def query_session_scope(self):
     """Provide a transactional scope around a series of operations."""
     session = Session()
     session.expire_on_commit = False
     try:
         yield session
     except Exception as err:
         raise
     finally:
         session.close()
예제 #3
0
    def _loadSentItemsTable(self, status):
        """
            Fill sent items table
        :param status: sent or unset
        :return:
        """
        # Number of columns
        session = Session()
        self.table_SentItems.setColumnCount(COLUMN_COUNT)
        self.table_SentItems.clear()
        """
            The next part was tricky, when creating a join, the results are returns with indexes
            for each table.  Hence in this case MailBox in table 0, and Projects is index 1.
            The SqlAlchemy code is equivalent to this SQL
                SELECT mailbox.id AS mailbox_id, mailbox.date_created AS mailbox_date_created,
                   mailbox.date_sent AS mailbox_date_sent, mailbox.mail_to AS mailbox_mail_to,
                   mailbox.subject AS mailbox_subject, mailbox.mail_body AS mailbox_mail_body,
                   projects.id AS projects_id, projects.parent_mail_id AS projects_parent_mail_id,
                   projects.scan_path AS projects_scan_path
                FROM mailbox JOIN projects ON mailbox.id = projects.parent_mail_id
                ORDER BY mailbox_id desc
        """
        mails = session.query(MailBox, Projects).join(
            Projects,
            MailBox.id == Projects.parent_mail_id).order_by(desc(MailBox.id))

        # Set the headers
        self.table_SentItems.setHorizontalHeaderLabels(
            ("ID", "Datum aanmaak", "Datum Verzonden", "Naar", "Onderwerp",
             "Project id", "Project naam"))
        # Create rows, use double ( for tuple
        rows = []
        for mail in mails:
            # Notice the indexes of the table
            rows.append(
                (str(mail[MAILBOX].id), str(mail[MAILBOX].date_created),
                 str(mail[MAILBOX].date_sent),
                 mail[MAILBOX].mail_to, mail[MAILBOX].subject,
                 str(mail[PROJECTS].id), mail[PROJECTS].scan_path))

        self.table_SentItems.setRowCount(len(rows))
        for row, cols in enumerate(rows):
            for col, text in enumerate(cols):
                table_item = QTableWidgetItem(text)
                # Optional, but very useful.
                table_item.setData(Qt.UserRole + 1, "user")
                self.table_SentItems.setItem(row, col, table_item)
        # Make the table look good
        self.table_SentItems.resizeColumnsToContents()
        # Don't need to see id field
        self.table_SentItems.hideColumn(5)
예제 #4
0
 def command_session_scope(self):
     """Provide a transactional scope around a series of operations."""
     session = Session()
     try:
         yield session
         session.commit()
     except Exception as err:
         session.rollback()
         raise
     finally:
         session.close()
예제 #5
0
 def activate_mail_instance(self, messageid):
     """
         Get the contents of the selected mail
     :param messageid: id of selected message
     :return: Nothing
     """
     self._lastIndexOfMail = messageid
     session = Session()
     mails = session.query(MailBox).filter(MailBox.id == messageid).first()
     proj = session.query(Projects).filter(
         Projects.parent_mail_id == messageid).first()
     # fill the textfields with the contents of the mail,
     # also activate the 'scan' and 'send' buttons in this case
     self.txtTo.setText(mails.mail_to)
     self.txtSubject.setText(mails.subject)
     self.txtProjectName.setText(proj.scan_path)
     self.txtBody.setPlainText(mails.mail_body)
     if not mails.date_sent:
         # user can still modify this email
         self.lblWarningNewMail.setVisible(True)
         # buttons
         self.msgFrameBox.setStyleSheet("background-color: rgb(148, 0, 0);")
         self.msgFrameBox.setVisible(False)
         self.btnSendEmail.setEnabled(True)
         self.btnSaveEmail.setEnabled(True)
         self.btnScanDoc.setEnabled(True)
         # input boxes
         self.txtTo.setEnabled(True)
         self.txtSubject.setEnabled(True)
         self.txtBody.setEnabled(True)
         self.txtProjectName.setEnabled(True)
     else:
         # mail was already sent, changes not allowed anymore
         self.msgFrameBox.setVisible(True)
         self.btnSendEmail.setEnabled(False)
         self.btnSaveEmail.setEnabled(False)
         self.btnScanDoc.setEnabled(False)
         self.txtTo.setEnabled(False)
         self.txtSubject.setEnabled(False)
         self.txtBody.setEnabled(False)
         self.txtProjectName.setEnabled(False)
    def generate_matches(self, db: Session, autocommit=True):
        # Grab the config values
        minimum_pool_size: int = self._stage.parsed_params['minimum_pool_size']
        if minimum_pool_size > len(self._stage.tournament.competitors):
            # There's not enough competitors for even a single pool
            raise ValueError('There are not enough competitors for even a single pool')
        if minimum_pool_size == 0:
            raise ValueError('Cannot have a pool size of 0')

        # Copy the competitors list so we don't muck up the ORM list
        competitors: List[Competitor] = [competitor for competitor in self._stage.tournament.competitors]
        # Randomize the order so we get randomized pools
        shuffle(competitors)

        # Determine how many pools are necessary
        num_pools = floor(len(competitors) / minimum_pool_size)

        for i in range(num_pools):
            # Create a new pool
            pool = Pool(stage=self._stage, ordinal=i)

            # Use the pool's ordinal value to grab its competitors
            pool_competitors = [competitor
                                for idx, competitor in enumerate(competitors)
                                if idx % num_pools == pool.ordinal]

            # Generate matches for the pool
            matches = self._generate_matches_for_pool(pool, pool_competitors)

            # Add the pool and matches to the DB
            db.add(pool)
            for match in matches:
                db.add(match)

        if autocommit:
            db.commit()
예제 #7
0
import database.orm as m

with open('room caius list 2014-15.csv') as f:
	d = csv.DictReader(f)
	data = list(d)

rent_keys = {
	2011: 'Rent/Term 2011',
	2012: 'Rent 2012',
	2013: 'Rent 2013',
	2014: 'Rent 2014'
}

print data[0]

s = Session()

bt_ugrad = (s
	.query(m.BallotType)
	.filter(m.BallotType.name == 'Undergraduate')
).one()

def get_room_by_name(name):
	""" Convert whatever name the spreadsheet uses into a room object """
	name = name.replace('Ct', 'Court')
	name = name.replace('Rd', 'Road')
	name = name.replace('Green St', 'Green Street')
	name = name.replace('Marys', 'Mary\'s')
	name = name.replace('Michaels', 'Michael\'s')
	name = name.replace('Cres', 'Crescent')
예제 #8
0
    def save_email(self):
        """
            Adds or update a new record to the scampy mailbox.
        """
        mail_action = "CREATE"
        if self._lastIndexOfMail:
            """ We already have a record """
            mail_action = "UPDATE"
            path = self._scan_base_folder + os.sep + str(self._lastIndexOfMail)
            self._full_doc_path = path

        if len(self.checkInputFields()) == 0:
            session = Session()
            date_created = datetime.datetime.now()
            date_sent = None
            mailbox_item = MailBox(date_created, date_sent, self.txtTo.text(),
                                   self.txtSubject.text(),
                                   self.txtBody.toPlainText())
            # Add new record
            if mail_action == "CREATE":
                session.add(mailbox_item)
                print("Message created")
                session.commit()
                self._lastIndexOfMail = mailbox_item.id
                project_item = Projects(mailbox_item.id,
                                        self.txtProjectName.text())
                session.add(project_item)
                session.commit()
                # Remember last project item id
                self._lastIndexOfProject = project_item.id
                logging.info(f"Created record {mailbox_item.id}")
                # Now create the target folder for the scans related to this email
                # Note, the folders will reside under the selected target folder in the settings.
                path = self._scan_base_folder + \
                    os.sep + str(self._lastIndexOfMail)
                self.lblScanTarget.setText(path)
                logging.warning(f"Creating folder {path}")
                try:
                    os.mkdir(path)
                except Exception as ex:
                    logging.error(f"Could not create path {path} {ex}")
            else:
                print("Message updated")
                # Get the item with the last mail id and update this record
                x = session.query(MailBox).get(self._lastIndexOfMail)
                # Now we can update the information
                x.subject = self.txtSubject.text()
                x.mail_to = self.txtTo.text()
                x.mail_body = self.txtBody.toPlainText()
                session.commit()
                logging.info(f"Updated record {self._lastIndexOfMail}")
                self.showMailOverview()

            session.close()
            # Now enable the scanning controls
            self.toggleScanControls(True)
        else:
            errfields = ""
            for field in self.checkInputFields():
                errfields += field + "\n"
            MsgBox.show("Probleem!", QMessageBox.Critical,
                        "De volgende velden zijn niet ingevuld!", errfields,
                        QMessageBox.Ok)
            logging.error(f"Problem with input")
            self.txtProjectName.setFocus()

            return False