예제 #1
0
        public override void Delete(IDatabase database)
        {
            foreach (var mailing in database.Query <Mailing>(DC.Equal("recipientfeedid", Id.Value)))
            {
                mailing.Delete(database);
            }

            foreach (var subscription in database.Query <Subscription>(DC.Equal("feedid", Id.Value)))
            {
                subscription.Delete(database);
            }

            foreach (var group in Groups)
            {
                group.Delete(database);
            }

            foreach (var child in Children.ToList())
            {
                child.Parent.Value = Parent.Value;
                database.Save(child);
            }

            database.Delete(this);
        }
예제 #2
0
        public override void Delete(IDatabase database)
        {
            foreach (var address in database.Query <PostalAddress>(DC.Equal("countryid", Id.Value)))
            {
                address.Delete(database);
            }

            database.Delete(this);
        }
예제 #3
0
        public override void Delete(IDatabase database)
        {
            foreach (var roleAssignment in database.Query <RoleAssignment>(DC.Equal("masterroleid", Id.Value)))
            {
                database.Delete(roleAssignment);
            }

            database.Delete(this);
        }
예제 #4
0
        public override void Delete(IDatabase database)
        {
            foreach (var document in database.Query <Sending>(DC.Equal("addressid", Id.Value)))
            {
                document.Delete(database);
            }

            database.Delete(this);
        }
예제 #5
0
        public override void Delete(IDatabase database)
        {
            foreach (var sending in database.Query <Sending>(DC.Equal("mailingid", Id.Value)))
            {
                sending.Delete(database);
            }

            database.Delete(this);
        }
예제 #6
0
        public override void Delete(IDatabase database)
        {
            foreach (var translation in database.Query <PhraseTranslation>(DC.Equal("phraseid", Id.Value)))
            {
                translation.Delete(database);
            }

            database.Delete(this);
        }
예제 #7
0
        public override void Delete(IDatabase database)
        {
            foreach (PostalAddress address in database.Query <PostalAddress>(DC.Equal("stateid", Id.Value)))
            {
                address.State.Value = null;
                database.Save(address);
            }

            database.Delete(this);
        }
예제 #8
0
 private IEnumerable <ServiceAddress> Targets(IDatabase database, Mailing mailing)
 {
     return(database
            .Query <Subscription>(DC.Equal("feedid", mailing.RecipientFeed.Value.Id.Value))
            .Where(m => m.IsActive)
            .Select(m => m.Contact.Value)
            .Where(p => (mailing.RecipientTag.Value == null) ||
                   (database.Query <TagAssignment>(DC.Equal("contactid", p.Id.Value).And(DC.Equal("tagid", mailing.RecipientTag.Value.Id.Value)))).Any())
            .Select(a => a.PrimaryAddress(ServiceType.EMail))
            .Where(a => a != null)
            .ToList());
 }
예제 #9
0
        private Country GetCountry(string name)
        {
            var country = _db.Query <Country>(DC.Equal("name", name)).FirstOrDefault();

            if (country == null)
            {
                country = new Country(Guid.NewGuid());
                country.Name.Value[Language.German] = name;
                _db.Save(country);
            }

            return(country);
        }
예제 #10
0
        private State GetState(string name)
        {
            var state = _db.Query <State>(DC.Equal("name", name)).FirstOrDefault();

            if (state == null)
            {
                state = new State(Guid.NewGuid());
                state.Name.Value[Language.German] = name;
                _db.Save(state);
            }

            return(state);
        }
예제 #11
0
        public DashboardItemViewModel(Translator translator, IDatabase db, Feed feed, int indent)
        {
            Tag    = "td";
            Indent = indent.ToString() + "%";
            Width  = (40 - indent).ToString() + "%";
            Name   = feed.Name.Value[translator.Language];
            var members = db
                          .Query <Subscription>(DC.Equal("feedid", feed.Id.Value))
                          .Where(m => !m.Contact.Value.Deleted)
                          .ToList();

            ValueOne = members.Count().ToString();
        }
예제 #12
0
        public override void Delete(IDatabase db)
        {
            foreach (var roleAssignment in db.Query <RoleAssignment>(DC.Equal("roleid", Id.Value)))
            {
                db.Delete(roleAssignment);
            }

            foreach (var permission in db.Query <Permission>(DC.Equal("roleid", Id.Value)))
            {
                db.Delete(permission);
            }

            db.Delete(this);
        }
예제 #13
0
        public override void Delete(IDatabase database)
        {
            foreach (var element in database.Query <Mailing>(DC.Equal("headerid", Id.Value)))
            {
                element.Delete(database);
            }

            foreach (var element in database.Query <Mailing>(DC.Equal("footerid", Id.Value)))
            {
                element.Delete(database);
            }

            database.Delete(this);
        }
예제 #14
0
        private Tag GetTag(string name, TagUsage usage, TagMode mode)
        {
            var tag = _db.Query <Tag>(DC.Equal("name", name)).FirstOrDefault();

            if (tag == null)
            {
                tag = new Tag(Guid.NewGuid());
                tag.Name.Value[Language.German] = name;
                tag.Usage.Value = usage;
                tag.Mode.Value  = mode;
                _db.Save(tag);
            }

            return(tag);
        }
예제 #15
0
        public override void Delete(IDatabase database)
        {
            foreach (var mailing in database.Query <Mailing>(DC.Equal("recipienttagid", Id.Value)))
            {
                mailing.RecipientTag.Value = null;
                database.Save(mailing);
            }

            foreach (var tagAssignment in database.Query <TagAssignment>(DC.Equal("tagid", Id.Value)))
            {
                tagAssignment.Delete(database);
            }

            database.Delete(this);
        }
 public ContactDetailDocumentViewModel(Translator translator, IDatabase database, Session session, Contact contact)
 {
     Id   = contact.Id.Value.ToString();
     List = new List <ContactDetailDocumentItemViewModel>(database
                                                          .Query <Document>(DC.Equal("contactid", contact.Id.Value))
                                                          .OrderBy(d => d.CreatedDate.Value)
                                                          .Select(d => new ContactDetailDocumentItemViewModel(translator, d)));
     Editable =
         session.HasAccess(contact, PartAccess.TagAssignments, AccessRight.Write) ?
         "editable" : "accessdenied";
     PhraseHeaderFile              = translator.Get("Contact.Detail.Document.Header.File", "Column 'File' on the document tab of the contact detail page", "File").EscapeHtml();
     PhraseHeaderType              = translator.Get("Contact.Detail.Document.Header.Type", "Column 'Type' on the document tab of the contact detail page", "Type").EscapeHtml();
     PhraseHeaderCreatedDate       = translator.Get("Contact.Detail.Document.Header.CreatedDate", "Column 'CreatedDate' on the document tab of the contact detail page", "Created").EscapeHtml();
     PhraseDeleteConfirmationTitle = translator.Get("Contact.Detail.Master.Document.Delete.Confirm.Title", "Delete document confirmation title", "Delete?").EscapeHtml();
     PhraseDeleteConfirmationInfo  = string.Empty;
 }
예제 #17
0
 public RoleAssignmentListViewModel(Translator translator, IDatabase database, Session session, Role role)
 {
     Id       = role.Id.Value.ToString();
     ParentId = role.Group.Value.Id.Value.ToString();
     PhraseHeaderRoleGroupFeed =
         translator.Get("RoleAssignment.List.Header.RoleGroupFeed", "Header part 'Feed' in the permission list", "{0} in {1} of {2}",
                        role.Name.Value[translator.Language],
                        role.Group.Value.Name.Value[translator.Language],
                        role.Group.Value.Feed.Value.Name.Value[translator.Language]).EscapeHtml();
     List = new List <RoleAssignmentListItemViewModel>(
         database.Query <RoleAssignment>(DC.Equal("roleid", role.Id.Value))
         .Select(ra => new RoleAssignmentListItemViewModel(translator, ra))
         .OrderBy(ra => ra.MasterRole));
     AddAccess = session.HasAccess(role.Group.Value, PartAccess.RoleAssignments, AccessRight.Write);
     Editable  = AddAccess ? "editable" : "accessdenied";
 }
예제 #18
0
 public PermissionListViewModel(Translator translator, IDatabase database, Session session, Role role)
 {
     Id       = role.Id.Value.ToString();
     ParentId = role.Group.Value.Id.Value.ToString();
     PhraseHeaderRoleGroupFeed =
         translator.Get("Permission.List.Header.RoleGroupFeed", "Header part 'Feed' in the permission list", "{0} in {1} of {2}",
                        role.Name.Value[translator.Language],
                        role.Group.Value.Name.Value[translator.Language],
                        role.Group.Value.Feed.Value.Name.Value[translator.Language]).EscapeHtml();
     PhraseHeaderPart              = translator.Get("Permission.List.Header.Part", "Link 'Part' caption in the permission list", "Part").EscapeHtml();
     PhraseHeaderSubject           = translator.Get("Permission.List.Header.Subject", "Link 'Subject' caption in the permission list", "Subject").EscapeHtml();
     PhraseHeaderRight             = translator.Get("Permission.List.Header.Right", "Link 'Right' caption in the permission list", "Right").EscapeHtml();
     PhraseDeleteConfirmationTitle = translator.Get("Permission.List.Delete.Confirm.Title", "Delete permission confirmation title", "Delete?").EscapeHtml();
     PhraseDeleteConfirmationInfo  = string.Empty;
     List = new List <PermissionListItemViewModel>(
         database.Query <Permission>(DC.Equal("roleid", role.Id.Value))
         .Select(c => new PermissionListItemViewModel(translator, c))
         .OrderBy(c => c.Subject + "/" + c.Part + "/" + c.Right));
     AddAccess = session.HasAccess(role.Group.Value, PartAccess.Structure, AccessRight.Write);
     Editable  = AddAccess ? "editable" : "accessdenied";
 }
예제 #19
0
        public override void Delete(IDatabase database)
        {
            foreach (var address in database.Query <PostalAddress>(DC.Equal("contactid", Id.Value)))
            {
                address.Delete(database);
            }

            foreach (var address in database.Query <ServiceAddress>(DC.Equal("contactid", Id.Value)))
            {
                address.Delete(database);
            }

            foreach (var subscription in database.Query <Subscription>(DC.Equal("contactid", Id.Value)))
            {
                subscription.Delete(database);
            }

            foreach (var roleAssignment in database.Query <RoleAssignment>(DC.Equal("contactid", Id.Value)))
            {
                roleAssignment.Delete(database);
            }

            foreach (var tagAssignment in database.Query <TagAssignment>(DC.Equal("contactid", Id.Value)))
            {
                tagAssignment.Delete(database);
            }

            foreach (var document in database.Query <Document>(DC.Equal("contactid", Id.Value)))
            {
                document.Delete(database);
            }

            foreach (var entry in database.Query <JournalEntry>(DC.Equal("contactid", Id.Value)))
            {
                entry.Delete(database);
            }

            database.Delete(this);
        }
예제 #20
0
 public RoleListItemViewModel(Translator translator, IDatabase database, Session session, Role role)
 {
     Id     = role.Id.Value.ToString();
     Name   = role.Name.Value[translator.Language];
     Access = string.Join("<br/>", role.Permissions
                          .Select(p => GetText(translator, p))
                          .OrderBy(p => p));
     if (string.IsNullOrEmpty(Access))
     {
         Access = translator.Get("Role.List.Access.None", "None access in role list", "None");
     }
     Occupants = string.Join("<br/>", database
                             .Query <RoleAssignment>(DC.Equal("roleid", role.Id.Value))
                             .Select(ra => ra.MasterRole.Value.Name.Value[translator.Language])
                             .OrderBy(p => p));
     if (string.IsNullOrEmpty(Occupants))
     {
         Occupants = translator.Get("Role.List.Occupants.None", "No occupants in role list", "None");
     }
     Editable =
         session.HasAccess(role.Group.Value.Feed.Value, PartAccess.Structure, AccessRight.Write) ?
         "editable" : "accessdenied";
     PhraseDeleteConfirmationQuestion = translator.Get("Role.List.Delete.Confirm.Question", "Delete role confirmation question", "Do you really wish to delete role {0}?", role.GetText(translator)).EscapeHtml();
 }
 public ContactDetailJournalViewModel(Translator translator, IDatabase database, Session session, Contact contact)
 {
     Id   = contact.Id.Value.ToString();
     List = new List <ContactDetailJournalItemViewModel>(database
                                                         .Query <JournalEntry>(DC.Equal("contactid", contact.Id.Value))
                                                         .OrderByDescending(d => d.Moment.Value)
                                                         .Select(d => new ContactDetailJournalItemViewModel(translator, d)));
     PhraseHeaderMoment  = translator.Get("Contact.Detail.Journal.Header.Moment", "Column 'Moment' on the journal tab of the contact detail page", "When").EscapeHtml();
     PhraseHeaderSubject = translator.Get("Contact.Detail.Journal.Header.Subject", "Column 'Subject' on the journal tab of the contact detail page", "Who").EscapeHtml();
     PhraseHeaderText    = translator.Get("Contact.Detail.Journal.Header.Text", "Column 'Text' on the journal tab of the contact detail page", "What").EscapeHtml();
 }
예제 #22
0
        public MailingScheduledViewModel(Translator translator, IDatabase db, Session session, Mailing mailing)
            : this(translator, session)
        {
            Id         = mailing.Id.Value.ToString();
            Title      = mailing.Title.Value.EscapeHtml();
            Recipients = mailing.RecipientFeed.Value.Name.Value[translator.Language];

            if (mailing.RecipientTag.Value != null)
            {
                Recipients = " / " + mailing.RecipientTag.Value.Name.Value[translator.Language];
            }

            if (mailing.RecipientLanguage.Value.HasValue)
            {
                Recipients = " / " + mailing.RecipientLanguage.Value.Value.Translate(translator);
            }

            var number = db
                         .Query <Contact>()
                         .Count(p => p.ActiveSubscriptions.Any(m => m.Feed == mailing.RecipientFeed.Value) &&
                                (mailing.RecipientTag.Value == null || p.TagAssignments.Any(t => t.Tag == mailing.RecipientTag.Value)));

            Recipients += " / " + translator.Get("Mailing.Scheduled.Fields.Recipients.Contacts", "Contacts in the recipients field on the scheduled mailing page", "circa {0} contacts", number);

            Subject = mailing.Subject.Value.EscapeHtml();

            var sendingDate =
                mailing.SendingDate.Value.HasValue ?
                mailing.SendingDate.Value.Value.ToLocalTime().ToString("dd.MM.yyyy HH:mm") :
                string.Empty;
            var sentDate =
                mailing.SentDate.Value.HasValue ?
                mailing.SentDate.Value.Value.ToLocalTime().ToString("dd.MM.yyyy HH:mm") :
                string.Empty;

            switch (mailing.Status.Value)
            {
            case MailingStatus.Scheduled:
                Status = translator.Get("Mailing.Scheduled.Field.Status.Scheduled", "Scheduled status in the status field the scheduled mailing page", "Scheduled for {0}", sendingDate).EscapeHtml();
                break;

            case MailingStatus.Sending:
                Status = translator.Get("Mailing.Scheduled.Field.Status.Sending", "Sending status in the status field the scheduled mailing page", "Sending since {0}", sendingDate).EscapeHtml();
                break;

            case MailingStatus.Sent:
                Status = translator.Get("Mailing.Scheduled.Field.Status.Sent", "Sent status in the status field the scheduled mailing page", "Sent at {0}", sentDate).EscapeHtml();
                break;

            case MailingStatus.Canceled:
                Status = translator.Get("Mailing.Scheduled.Field.Status.Canceled", "Canceled status in the status field the scheduled mailing page", "Canceled").EscapeHtml();
                break;

            default:
                throw new NotSupportedException();
            }

            Sendings = new List <MailingSendingViewModel>(db
                                                          .Query <Sending>(DC.Equal("mailingid", mailing.Id.Value))
                                                          .Select(s => new MailingSendingViewModel(translator, s)));

            Cancelable = mailing.Status.Value == MailingStatus.Scheduled ||
                         mailing.Status.Value == MailingStatus.Sending;
        }
예제 #23
0
        public ContactListModule()
        {
            this.RequiresAuthentication();

            Get["/contact/list"] = parameters =>
            {
                return(View["View/contactlist.sshtml", new ContactListViewModel(Database, Translator, CurrentSession)]);
            };
            Get["/contact/list/settings/list"] = parameters =>
            {
                var settingsList = Database
                                   .Query <SearchSettings>(DC.Equal("userid", CurrentSession.User.Id.Value))
                                   .ToList();
                var result = new JArray();

                if (!settingsList.Any())
                {
                    var settings = new SearchSettings(Guid.NewGuid());
                    settings.User.Value = CurrentSession.User;
                    settings.Name.Value = Translate("Contact.List.Settings.DefaultName", "Default name for new search settings", "Default");
                    Database.Save(settings);
                    settingsList.Add(settings);
                }

                foreach (var settings in settingsList)
                {
                    result.Add(
                        new JObject(
                            new JProperty("Id", settings.Id.Value),
                            new JProperty("Name", settings.Name.Value)));
                }

                return(result.ToString());
            };
            Get["/contact/list/settings/get/{ssid}"] = parameters =>
            {
                string searchSettingsId = parameters.ssid;
                var    settings         = Database.Query <SearchSettings>(searchSettingsId);

                if (settings == null ||
                    settings.User.Value != CurrentSession.User)
                {
                    return(null);
                }

                var update = new SearchSettingsUpdate(settings);
                return(JsonConvert.SerializeObject(update).ToString());
            };
            Post["/contact/list/settings/set/{ssid}"] = parameters =>
            {
                var    update           = JsonConvert.DeserializeObject <SearchSettingsUpdate>(ReadBody());
                string searchSettingsId = parameters.ssid;
                var    settings         = Database.Query <SearchSettings>(searchSettingsId);
                var    status           = CreateStatus();

                if (settings == null)
                {
                    settings            = new SearchSettings(Guid.NewGuid());
                    settings.User.Value = CurrentSession.User;
                }
                else if (settings.User.Value != CurrentSession.User)
                {
                    status.SetErrorAccessDenied();
                }

                update.Apply(Database, settings);
                Database.Save(settings);
                return(status.CreateJsonData());
            };
            Get["/contact/list/data/{ssid}"] = parameters =>
            {
                string searchSettingsId = parameters.ssid;
                var    settings         = Database.Query <SearchSettings>(searchSettingsId);
                if (settings == null)
                {
                    return(null);
                }
                var contacts = Database.Query <Contact>()
                               .Where(c => Filter(c, settings));
                var skip = settings.ItemsPerPage * settings.CurrentPage;
                if (skip > contacts.Count())
                {
                    skip = 0;
                }
                var page = contacts
                           .OrderBy(c => c.SortName)
                           .Skip(skip)
                           .Take(settings.ItemsPerPage);
                return(View["View/contactlist_data.sshtml", new ContactListDataViewModel(Database, Translator, page, settings, CurrentSession)]);
            };
            Get["/contact/list/pages/{ssid}"] = parameters =>
            {
                string searchSettingsId = parameters.ssid;
                var    settings         = Database.Query <SearchSettings>(searchSettingsId);
                if (settings == null)
                {
                    return(null);
                }
                var personCount = Database.Query <Contact>()
                                  .Count(c => Filter(c, settings));
                var itemsPerPage = Math.Max(1, settings.ItemsPerPage.Value);
                var pageCount    = Math.Max(1, (personCount / itemsPerPage) + Math.Min(personCount % itemsPerPage, 1));

                if (settings.CurrentPage.Value >= pageCount)
                {
                    settings.CurrentPage.Value = 0;
                    Database.Save(settings);
                }

                return(View["View/contactlist_pages.sshtml", new ContactPagesViewModel(Translator, pageCount, settings)]);
            };
        }
예제 #24
0
        private void RunSending(IDatabase database, Mailing mailing)
        {
            int remainingCount = 0;

            foreach (var sending in database.Query <Sending>(DC.Equal("mailingid", mailing.Id.Value)))
            {
                if (sending.Status.Value == SendingStatus.Created)
                {
                    if (_maxMailsCount > 0)
                    {
                        _maxMailsCount--;
                        var header    = mailing.Header.Value;
                        var footer    = mailing.Footer.Value;
                        var htmlText  = mailing.HtmlText.Value;
                        var plainText = mailing.PlainText.Value;

                        if (header != null)
                        {
                            htmlText  = HtmlWorker.ConcatHtml(header.HtmlText.Value, htmlText);
                            plainText = header.PlainText.Value + plainText;
                        }

                        if (footer != null)
                        {
                            htmlText  = HtmlWorker.ConcatHtml(htmlText, footer.HtmlText.Value);
                            plainText = plainText + footer.PlainText.Value;
                        }

                        var translation = new Translation(database);
                        var translator  = new Translator(translation, sending.Address.Value.Contact.Value.Language.Value);
                        var templator   = new Templator(new ContactContentProvider(translator, sending.Address.Value.Contact.Value));
                        htmlText  = templator.Apply(htmlText);
                        plainText = templator.Apply(plainText);

                        try
                        {
                            var language = sending.Address.Value.Contact.Value.Language.Value;
                            var from     = new MimeKit.MailboxAddress(
                                mailing.Sender.Value.MailName.Value[language],
                                mailing.Sender.Value.MailAddress.Value[language]);
                            var to = new MimeKit.MailboxAddress(
                                sending.Address.Value.Contact.Value.ShortHand,
                                sending.Address.Value.Address.Value);
                            var senderKey = mailing.Sender.Value.GpgKeyId.Value == null ? null :
                                            new GpgPrivateKeyInfo(
                                mailing.Sender.Value.GpgKeyId.Value,
                                mailing.Sender.Value.GpgKeyPassphrase.Value);
                            var content  = new Multipart("alternative");
                            var textPart = new TextPart("plain")
                            {
                                Text = plainText
                            };
                            textPart.ContentTransferEncoding = ContentEncoding.QuotedPrintable;
                            content.Add(textPart);
                            var htmlPart = new TextPart("html")
                            {
                                Text = htmlText
                            };
                            htmlPart.ContentTransferEncoding = ContentEncoding.QuotedPrintable;
                            content.Add(htmlPart);

                            Global.Mail.Send(from, to, senderKey, null, mailing.Subject.Value, content);
                            sending.Status.Value   = SendingStatus.Sent;
                            sending.SentDate.Value = DateTime.UtcNow;
                            database.Save(sending);
                            Journal(database, mailing, sending.Address.Value.Contact.Value,
                                    "MailTask.Journal.Sent",
                                    "Journal entry sent mail",
                                    "Task sent mail {0}",
                                    t => mailing.Title.Value);
                        }
                        catch (Exception exception)
                        {
                            sending.Status.Value         = SendingStatus.Failed;
                            sending.FailureMessage.Value = exception.Message;
                            sending.SentDate.Value       = DateTime.UtcNow;
                            database.Save(sending);
                            Journal(database, mailing, sending.Address.Value.Contact.Value,
                                    "MailTask.Journal.Failed",
                                    "Journal entry sending mail failed",
                                    "Task failed sending mail {0}",
                                    t => mailing.Title.Value);
                        }
                    }
                    else
                    {
                        remainingCount++;
                    }
                }
            }

            if (remainingCount < 1)
            {
                mailing.Status.Value   = MailingStatus.Sent;
                mailing.SentDate.Value = DateTime.UtcNow;
                database.Save(mailing);
                Global.Log.Notice("Mailing {0} has finished sending", mailing.Title);
            }
            else
            {
                Global.Log.Notice("Mailing {0} needs to send {1} more mails", mailing.Title, remainingCount);
            }
        }