/// <summary>
        ///    Prüft verschiedene Kriterien, nach denen das Dokument bearbeitbar ist. Bei Einem Fehler ist der Rückgabewert
        ///    ungleich null.
        /// </summary>
        /// <param name="documentID">die ID des Dokuments</param>
        /// <param name="topic">Das zugeordnete Thema, falls eines existiert.</param>
        /// <param name="document">Das Doukument, das der ID zugeordnet ist.</param>
        /// <returns></returns>
        private ActionResult CheckConstraints(int documentID, [CanBeNull] out Topic topic, out Document document)
        {
            topic = null;
            document = db.Documents.Find(documentID);

            if (document == null)
                return HTTPStatus(HttpStatusCode.NotFound, "Dokument-ID nicht gefunden.");

            if (document.LockTime != null)
                return HTTPStatus(HttpStatusCode.Forbidden, "Das Dokument ist derzeit gesperrt.");

            if (document.TopicID == null)
                return null; // Alle Checks bestanden

            topic = db.Topics.Find(document.TopicID.Value);

            if (IsTopicLocked(document.TopicID.Value))
                return HTTPStatus(HttpStatusCode.Forbidden, "Da das Thema gesperrt ist, können Sie keine Dateien hochladen.");

            if (topic.IsReadOnly)
            {
                return HTTPStatus(HttpStatusCode.Forbidden,
                    "Da das Thema schreibgeschützt ist, können Sie keine Dateien bearbeiten.");
            }
            return null;
        }
        public ActionResult _CreateDocuments(DocumentContainer entityKind, int id)
        {
            if (Request.Files.Count == 0)
                return HTTPStatus(HttpStatusCode.BadRequest, "Es wurden keine Dateien empfangen.");

            if (id <= 0)
                return HTTPStatus(HttpStatusCode.BadRequest, "Die Dateien können keinem Ziel zugeordnet werden.");

            Topic topic = null;
            if (entityKind == DocumentContainer.Topic)
            {
                topic = db.Topics.Find(id);

                if (IsTopicLocked(id))
                    return HTTPStatus(HttpStatusCode.Forbidden, "Da das Thema gesperrt ist, können Sie keine Dateien hochladen.");

                if (topic.IsReadOnly)
                {
                    return HTTPStatus(HttpStatusCode.Forbidden,
                        "Da das Thema schreibgeschützt ist, können Sie keine Dateien bearbeiten.");
                }
            }

            var statusMessage = new StringBuilder();
            int successful = 0;

            for (int i = 0; i < Request.Files.Count; i++)
            {
                HttpPostedFileBase file = Request.Files[i];

                if (file == null)
                    continue;

                if (string.IsNullOrWhiteSpace(file.FileName))
                {
                    statusMessage.AppendLine("Eine Datei hat einen ungültigen Dateinamen.");
                    continue;
                }
                string fullName = Path.GetFileName(file.FileName);
                if (file.ContentLength == 0)
                {
                    statusMessage.AppendFormat("Datei \"{0}\" hat keinen Inhalt.", fullName).AppendLine();
                    continue;
                }

                string filename = Path.GetFileNameWithoutExtension(file.FileName);
                string fileext = Path.GetExtension(file.FileName);
                if (!string.IsNullOrEmpty(fileext))
                    fileext = fileext.Substring(1);

                var revision = new Revision
                {
                    SafeName = InvalidChars.Replace(filename, ""),
                    FileSize = file.ContentLength,
                    UploaderID = GetCurrentUserID(),
                    Extension = fileext,
                    GUID = Guid.NewGuid(),
                    Created = DateTime.Now
                };

                Document document = new Document(revision)
                {
                    Deleted = null,
                    DisplayName = fullName
                };

                switch (entityKind)
                {
                    case DocumentContainer.Topic:
                        document.TopicID = id;
                        break;
                    case DocumentContainer.EmployeePresentation:
                        document.EmployeePresentationID = id;
                        break;
                    default:
                        throw new InvalidEnumArgumentException("entityKind", (int)entityKind, typeof(DocumentContainer));
                }

                try
                {
                    db.Documents.Add(document);
                    db.SaveChanges(); // Damit die Revision die ID bekommt. Diese wird anschließend im Dateinamen hinterlegt
                    document.LatestRevision = revision;
                    db.SaveChanges();
                    string path = Path.Combine(Serverpath, revision.FileName);
                    file.SaveAs(path);
                    successful++;
                }
                catch (DbEntityValidationException ex)
                {
                    var message = ErrorMessageFromException(ex);
                    statusMessage.AppendFormat("Datei \"{0}\" konnte nicht in der Datenbank gespeichert werden.\n{1}", fullName,
                        message)
                        .AppendLine();
                }
                catch (IOException)
                {
                    statusMessage.AppendFormat("Datei \"{0}\" konnte nicht gespeichert werden.", fullName).AppendLine();
                }
            }
            statusMessage.AppendFormat(
                successful == 1 ? "Eine Datei wurde erfolgreich verarbeitet." : "{0} Dateien wurden erfolgreich verarbeitet.",
                successful);

            // Ungelesen-Markierung aktualisieren
            if (topic != null && successful > 0)
                MarkAsUnread(topic);

            ViewBag.StatusMessage = statusMessage.ToString();

            return _List(id, entityKind);
        }