From 16af85004c84d0d6c626b4f8424ce9647669a0c1 Mon Sep 17 00:00:00 2001
From: RaNaN <Mast3rRaNaN@hotmail.de>
Date: Sun, 9 Jun 2013 18:10:22 +0200
Subject: moved everything from module to pyload

---
 pyload/datatypes/PyFile.py    | 268 ++++++++++++++++++++++++++++++++++++++++++
 pyload/datatypes/PyPackage.py | 115 ++++++++++++++++++
 pyload/datatypes/User.py      |  63 ++++++++++
 pyload/datatypes/__init__.py  |   0
 4 files changed, 446 insertions(+)
 create mode 100644 pyload/datatypes/PyFile.py
 create mode 100644 pyload/datatypes/PyPackage.py
 create mode 100644 pyload/datatypes/User.py
 create mode 100644 pyload/datatypes/__init__.py

(limited to 'pyload/datatypes')

diff --git a/pyload/datatypes/PyFile.py b/pyload/datatypes/PyFile.py
new file mode 100644
index 000000000..ba5208795
--- /dev/null
+++ b/pyload/datatypes/PyFile.py
@@ -0,0 +1,268 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+###############################################################################
+#   Copyright(c) 2008-2012 pyLoad Team
+#   http://www.pyload.org
+#
+#   This file is part of pyLoad.
+#   pyLoad is free software: you can redistribute it and/or modify
+#   it under the terms of the GNU Affero General Public License as
+#   published by the Free Software Foundation, either version 3 of the
+#   License, or (at your option) any later version.
+#
+#   Subjected to the terms and conditions in LICENSE
+#
+#   @author: RaNaN
+###############################################################################
+
+from time import sleep, time
+from ReadWriteLock import ReadWriteLock
+
+from pyload.Api import ProgressInfo, DownloadProgress, FileInfo, DownloadInfo, DownloadStatus
+from pyload.utils import lock, read_lock
+
+statusMap = {
+    "none": 0,
+    "offline": 1,
+    "online": 2,
+    "queued": 3,
+    "paused": 4,
+    "finished": 5,
+    "skipped": 6,
+    "failed": 7,
+    "starting": 8,
+    "waiting": 9,
+    "downloading": 10,
+    "temp. offline": 11,
+    "aborted": 12,
+    "decrypting": 13,
+    "processing": 14,
+    "custom": 15,
+    "unknown": 16,
+}
+
+
+class PyFile(object):
+    """
+    Represents a file object at runtime
+    """
+    __slots__ = ("m", "fid", "_name", "_size", "filestatus", "media", "added", "fileorder",
+                 "url", "pluginname", "hash", "status", "error", "packageid", "ownerid",
+                 "lock", "plugin", "waitUntil", "abort", "statusname",
+                 "reconnected", "pluginclass")
+
+    @staticmethod
+    def fromInfoData(m, info):
+        f = PyFile(m, info.fid, info.name, info.size, info.status, info.media, info.added, info.fileorder,
+                   "", "", "", DownloadStatus.NA, "", info.package, info.owner)
+        if info.download:
+            f.url = info.download.url
+            f.pluginname = info.download.plugin
+            f.hash = info.download.hash
+            f.status = info.download.status
+            f.error = info.download.error
+
+        return f
+
+    def __init__(self, manager, fid, name, size, filestatus, media, added, fileorder,
+                 url, pluginname, hash, status, error, package, owner):
+
+        self.m = manager
+
+        self.fid = int(fid)
+        self._name = name
+        self._size = size
+        self.filestatus = filestatus
+        self.media = media
+        self.added = added
+        self.fileorder = fileorder
+        self.url = url
+        self.pluginname = pluginname
+        self.hash = hash
+        self.status = status
+        self.error = error
+        self.ownerid = owner
+        self.packageid = package
+        # database information ends here
+
+        self.lock = ReadWriteLock()
+
+        self.plugin = None
+
+        self.waitUntil = 0 # time() + time to wait
+
+        # status attributes
+        self.abort = False
+        self.reconnected = False
+        self.statusname = None
+
+
+    @property
+    def id(self):
+        self.m.core.log.debug("Deprecated attr .id, use .fid instead")
+        return self.fid
+
+    def setSize(self, value):
+        self._size = int(value)
+
+    # will convert all sizes to ints
+    size = property(lambda self: self._size, setSize)
+
+    def getName(self):
+        try:
+            if self.plugin.req.name:
+                return self.plugin.req.name
+            else:
+                return self._name
+        except:
+            return self._name
+
+    def setName(self, name):
+        """ Only set unicode or utf8 strings as name """
+        if type(name) == str:
+            name = name.decode("utf8")
+
+        self._name = name
+
+    name = property(getName, setName)
+
+    def __repr__(self):
+        return "<PyFile %s: %s@%s>" % (self.id, self.name, self.pluginname)
+
+    @lock
+    def initPlugin(self):
+        """ inits plugin instance """
+        if not self.plugin:
+            self.pluginclass = self.m.core.pluginManager.getPlugin(self.pluginname)
+            self.plugin = self.pluginclass(self)
+
+    @read_lock
+    def hasPlugin(self):
+        """Thread safe way to determine this file has initialized plugin attribute"""
+        return hasattr(self, "plugin") and self.plugin
+
+    def package(self):
+        """ return package instance"""
+        return self.m.getPackage(self.packageid)
+
+    def setStatus(self, status):
+        self.status = statusMap[status]
+        # needs to sync so status is written to database
+        self.sync()
+
+    def setCustomStatus(self, msg, status="processing"):
+        self.statusname = msg
+        self.setStatus(status)
+
+    def getStatusName(self):
+        if self.status not in (13, 14) or not self.statusname:
+            return self.m.statusMsg[self.status]
+        else:
+            return self.statusname
+
+    def hasStatus(self, status):
+        return statusMap[status] == self.status
+
+    def sync(self):
+        """sync PyFile instance with database"""
+        self.m.updateFile(self)
+
+    @lock
+    def release(self):
+        """sync and remove from cache"""
+        if hasattr(self, "plugin") and self.plugin:
+            self.plugin.clean()
+            del self.plugin
+
+        self.m.releaseFile(self.fid)
+
+
+    def toInfoData(self):
+        return FileInfo(self.fid, self.getName(), self.packageid, self.ownerid, self.getSize(), self.filestatus,
+                        self.media, self.added, self.fileorder, DownloadInfo(
+                self.url, self.pluginname, self.hash, self.status, self.getStatusName(), self.error
+            )
+        )
+
+    def getPath(self):
+        pass
+
+    def move(self, pid):
+        pass
+
+    @read_lock
+    def abortDownload(self):
+        """abort pyfile if possible"""
+        # TODO: abort timeout, currently dead locks
+        while self.id in self.m.core.threadManager.processingIds():
+            self.abort = True
+            if self.plugin and self.plugin.req:
+                self.plugin.req.abortDownloads()
+            sleep(0.1)
+
+        self.abort = False
+        if self.plugin and self.plugin.req:
+            self.plugin.req.abortDownloads()
+
+        self.release()
+
+    def finishIfDone(self):
+        """set status to finish and release file if every thread is finished with it"""
+
+        if self.id in self.m.core.threadManager.processingIds():
+            return False
+
+        self.setStatus("finished")
+        self.release()
+        self.m.checkAllLinksFinished()
+        return True
+
+    def checkIfProcessed(self):
+        self.m.checkAllLinksProcessed(self.id)
+
+    def getSpeed(self):
+        """ calculates speed """
+        try:
+            return self.plugin.req.speed
+        except:
+            return 0
+
+    def getETA(self):
+        """ gets established time of arrival / or waiting time"""
+        try:
+            if self.status == DownloadStatus.Waiting:
+                return self.waitUntil - time()
+
+            return self.getBytesLeft() / self.getSpeed()
+        except:
+            return 0
+
+    def getBytesArrived(self):
+        """ gets bytes arrived """
+        try:
+            return self.plugin.req.arrived
+        except:
+            return 0
+
+    def getBytesLeft(self):
+        """ gets bytes left """
+        try:
+            return self.plugin.req.size - self.plugin.req.arrived
+        except:
+            return 0
+
+    def getSize(self):
+        """ get size of download """
+        try:
+            if self.plugin.req.size:
+                return self.plugin.req.size
+            else:
+                return self.size
+        except:
+            return self.size
+
+    def getProgressInfo(self):
+        return ProgressInfo(self.pluginname, self.name, self.getStatusName(), self.getETA(),
+                            self.getBytesArrived(), self.getSize(),
+                            DownloadProgress(self.fid, self.packageid, self.getSpeed(), self.status))
diff --git a/pyload/datatypes/PyPackage.py b/pyload/datatypes/PyPackage.py
new file mode 100644
index 000000000..d23ae88e7
--- /dev/null
+++ b/pyload/datatypes/PyPackage.py
@@ -0,0 +1,115 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+###############################################################################
+#   Copyright(c) 2008-2012 pyLoad Team
+#   http://www.pyload.org
+#
+#   This file is part of pyLoad.
+#   pyLoad is free software: you can redistribute it and/or modify
+#   it under the terms of the GNU Affero General Public License as
+#   published by the Free Software Foundation, either version 3 of the
+#   License, or (at your option) any later version.
+#
+#   Subjected to the terms and conditions in LICENSE
+#
+#   @author: RaNaN
+###############################################################################
+
+from time import time
+
+from pyload.Api import PackageInfo, PackageStatus
+from pyload.utils.fs import join
+
+class PyPackage:
+    """
+    Represents a package object at runtime
+    """
+
+    @staticmethod
+    def fromInfoData(m, info):
+        return PyPackage(m, info.pid, info.name, info.folder, info.root, info.owner,
+            info.site, info.comment, info.password, info.added, info.tags, info.status, info.shared, info.packageorder)
+
+    def __init__(self, manager, pid, name, folder, root, owner, site, comment, password, added, tags, status,
+                 shared, packageorder):
+        self.m = manager
+
+        self.pid = pid
+        self.name = name
+        self.folder = folder
+        self.root = root
+        self.ownerid = owner
+        self.site = site
+        self.comment = comment
+        self.password = password
+        self.added = added
+        self.tags = tags
+        self.status = status
+        self.shared = shared
+        self.packageorder = packageorder
+        self.timestamp = time()
+
+        #: Finish event already fired
+        self.setFinished = False
+
+    @property
+    def id(self):
+        self.m.core.log.debug("Deprecated package attr .id, use .pid instead")
+        return self.pid
+
+    def isStale(self):
+        return self.timestamp + 30 * 60 > time()
+
+    def toInfoData(self):
+        return PackageInfo(self.pid, self.name, self.folder, self.root, self.ownerid, self.site,
+            self.comment, self.password, self.added, self.tags, self.status, self.shared, self.packageorder
+        )
+
+    def getChildren(self):
+        """get information about contained links"""
+        return self.m.getPackageData(self.pid)["links"]
+
+    def getPath(self, name=""):
+        self.timestamp = time()
+        return join(self.m.getPackage(self.root).getPath(), self.folder, name)
+
+    def sync(self):
+        """sync with db"""
+        self.m.updatePackage(self)
+
+    def release(self):
+        """sync and delete from cache"""
+        self.sync()
+        self.m.releasePackage(self.id)
+
+    def delete(self):
+        self.m.deletePackage(self.id)
+
+    def deleteIfEmpty(self):
+        """  True if deleted  """
+        if not len(self.getChildren()):
+            self.delete()
+            return True
+        return False
+
+    def notifyChange(self):
+        self.m.core.eventManager.dispatchEvent("packageUpdated", self.id)
+
+
+class RootPackage(PyPackage):
+    def __init__(self, m, owner):
+        PyPackage.__init__(self, m, -1, "root", "", owner, -2, "", "", "", 0, [], PackageStatus.Ok, False, 0)
+
+    def getPath(self, name=""):
+        return join(self.m.core.config["general"]["download_folder"], name)
+
+    # no database operations
+    def sync(self):
+        pass
+
+    def delete(self):
+        pass
+
+    def release(self):
+        pass
\ No newline at end of file
diff --git a/pyload/datatypes/User.py b/pyload/datatypes/User.py
new file mode 100644
index 000000000..31c9a55cc
--- /dev/null
+++ b/pyload/datatypes/User.py
@@ -0,0 +1,63 @@
+#!/usr/bin/env python
+# -*- coding: utf-8 -*-
+
+###############################################################################
+#   Copyright(c) 2008-2012 pyLoad Team
+#   http://www.pyload.org
+#
+#   This file is part of pyLoad.
+#   pyLoad is free software: you can redistribute it and/or modify
+#   it under the terms of the GNU Affero General Public License as
+#   published by the Free Software Foundation, either version 3 of the
+#   License, or (at your option) any later version.
+#
+#   Subjected to the terms and conditions in LICENSE
+#
+#   @author: RaNaN
+###############################################################################
+
+
+from pyload.Api import UserData, Permission, Role
+from pyload.utils import bits_set
+
+#TODO: activate user
+#noinspection PyUnresolvedReferences
+class User(UserData):
+
+    @staticmethod
+    def fromUserData(api, user):
+        return User(api, user.uid, user.name, user.email, user.role, user.permission, user.folder,
+            user.traffic, user.dllimit, user.dlquota, user.hddquota, user.user, user.templateName)
+
+    def __init__(self, api,  *args, **kwargs):
+        UserData.__init__(self, *args, **kwargs)
+        self.api = api
+
+
+    def toUserData(self):
+        # TODO
+        return UserData()
+
+    def hasPermission(self, perms):
+        """  Accepts permission bit or name  """
+        if isinstance(perms, basestring) and hasattr(Permission, perms):
+            perms = getattr(Permission, perms)
+
+        return bits_set(perms, self.permission)
+
+    def hasRole(self, role):
+        if isinstance(role, basestring) and hasattr(Role, role):
+            role = getattr(Role, role)
+
+        return self.role == role
+
+    def isAdmin(self):
+        return self.hasRole(Role.Admin)
+
+    @property
+    def primary(self):
+        """ Primary user id, Internal user handle used for most operations
+        Secondary user account share id with primary user. Only Admins have no primary id. """
+        if self.hasRole(Role.Admin):
+            return None
+        return self.user if self.user else self.uid
\ No newline at end of file
diff --git a/pyload/datatypes/__init__.py b/pyload/datatypes/__init__.py
new file mode 100644
index 000000000..e69de29bb
-- 
cgit v1.2.3