Skip to content

Instantly share code, notes, and snippets.

@curtwagner1984
Created January 11, 2019 09:59
Show Gist options
  • Select an option

  • Save curtwagner1984/72ac593c7acc33d3037eae0f7e298171 to your computer and use it in GitHub Desktop.

Select an option

Save curtwagner1984/72ac593c7acc33d3037eae0f7e298171 to your computer and use it in GitHub Desktop.
import datetime
import PySide2
from PySide2.QtCore import QAbstractListModel, QModelIndex, Qt
from database.models.subreddit import *
from random import shuffle
epoch = datetime.utcfromtimestamp(0)
def unix_time(dt):
return (dt - epoch).total_seconds()
class SubmissionModel(QAbstractListModel):
NameRole = Qt.UserRole + 1
TitleRole = Qt.UserRole + 2
UrlRole = Qt.UserRole + 3
TimeRole = Qt.UserRole + 4
IsVideoRole = Qt.UserRole + 5
UpvotesRole = Qt.UserRole + 6
SubRedditRole = Qt.UserRole + 7
IsUpvotedRole = Qt.UserRole + 8
SavedPathRole = Qt.UserRole + 9
_roles = {NameRole: b"name",
TitleRole: b"title",
UrlRole: b"url",
TimeRole: b"time",
IsVideoRole: b"is_video",
UpvotesRole: b"upvotes",
SubRedditRole: b"subreddit",
IsUpvotedRole: b"is_upvoted",
SavedPathRole: b"saved_path",
}
def __init__(self, parent=None):
super(SubmissionModel, self).__init__(parent)
self._submissions = []
def model_reset(self):
self.beginResetModel()
self._submissions.clear()
self.endResetModel()
def sort_by_upvotes(self):
self._submissions.sort(key=lambda x: x.upvotes, reverse=True)
def sort_by_create_time(self):
self._submissions.sort(key=lambda x: x.date_of_submission, reverse=True)
def sort_by_random(self):
shuffle(self._submissions)
def rowCount(self, parent=QModelIndex()):
return len(self._submissions)
def append_list(self, submission_list_to_add):
if submission_list_to_add:
current_count = self.rowCount()
self.beginInsertRows(QModelIndex(), current_count, current_count + len(submission_list_to_add))
self._submissions = submission_list_to_add + self._submissions
self.endInsertRows()
def populate_from_list(self, submission_list):
if submission_list:
# current_count = self.rowCount()
# self.beginInsertRows(QModelIndex(), current_count, current_count + len(submission_list))
self.beginResetModel()
self._submissions = submission_list
self.sort_by_random()
# self._submissions.append(submission_list)
self.endResetModel()
def add_submission(self, submission: DbSubmissionQObject):
try:
assert isinstance(submission, DbSubmissionQObject)
except AssertionError as e:
print("Failed assertion in add_submission : {}".format(submission))
return
if submission not in self._submissions:
# print('Adding Submission {} to model'.format(submission))
self.beginInsertRows(QModelIndex(), self.rowCount(), self.rowCount())
self._submissions.append(submission)
# print("Added submission:{}, to list".format(submission))
self.endInsertRows()
else:
print('Submission {} is already in the model'.format(submission))
def removeRows(self, row: int, count: int, parent: PySide2.QtCore.QModelIndex = ...):
self.beginRemoveRows(QModelIndex(), row, row + count - 1)
del self._submissions[row:row + count]
print("Removed Item in {} place in the list".format(row))
self.endRemoveRows()
return True
def roleNames(self):
return self._roles
def data(self, index: PySide2.QtCore.QModelIndex, role: int = ...):
try:
submission = self._submissions[index.row()]
try:
assert isinstance(submission, DbSubmissionQObject)
except AssertionError as e:
return None
except IndexError:
return None
if role == self.NameRole:
return submission.name
if role == self.TitleRole:
return submission.title
if role == self.UrlRole:
return submission.url
if role == self.TimeRole:
delta = datetime.now() - submission.date_of_submission
return "Submitted {} ago".format(str(delta))
if role == self.IsVideoRole:
return submission.is_video
if role == self.UpvotesRole:
return submission.upvotes
if role == self.SubRedditRole:
return submission.subreddit_name
if role == self.IsUpvotedRole:
return submission.is_upvoted
if role == self.SavedPathRole:
return submission.saved_path
return None
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment