Ejemplo n.º 1
0
        public IActionResult Create(int campaignId)
        {
            CampaignSummaryModel campaign = _mediator.Send(new CampaignSummaryQuery {
                CampaignId = campaignId
            });

            if (campaign == null || !User.IsOrganizationAdmin(campaign.OrganizationId))
            {
                return(HttpUnauthorized());
            }


            var activity = new ActivityDetailModel
            {
                CampaignId       = campaign.Id,
                CampaignName     = campaign.Name,
                TimeZoneId       = campaign.TimeZoneId,
                OrganizationId   = campaign.OrganizationId,
                OrganizationName = campaign.OrganizationName,
                StartDateTime    = DateTime.Today.Date,
                EndDateTime      = DateTime.Today.Date.AddMonths(1)
            };

            return(View("Edit", activity));
        }
Ejemplo n.º 2
0
        public async Task <List <KeyValuePair <string, string> > > Validate(ActivityDetailModel model, CampaignSummaryModel parentCampaign)
        {
            var result = new List <KeyValuePair <string, string> >();

            if (model.EndDateTime < model.StartDateTime)
            {
                result.Add(new KeyValuePair <string, string>(nameof(model.EndDateTime), "End date cannot be earlier than the start date"));
            }

            if (model.StartDateTime < parentCampaign.StartDate)
            {
                result.Add(new KeyValuePair <string, string>(nameof(model.StartDateTime), "Start date cannot be earlier than the campaign start date " + parentCampaign.StartDate.ToString("d")));
            }

            if (model.EndDateTime > parentCampaign.EndDate)
            {
                result.Add(new KeyValuePair <string, string>(nameof(model.EndDateTime), "End date cannot be later than the campaign end date " + parentCampaign.EndDate.ToString("d")));
            }

            var postalCodeValidation = new LocationEditModelValidator(_mediator);
            var postalCodeErrors     = await postalCodeValidation.Validate(model.Location);

            postalCodeErrors.ToList().ForEach(e => result.Add(new KeyValuePair <string, string>(e.Key, e.Value)));
            return(result);
        }
Ejemplo n.º 3
0
        public async Task <IActionResult> Create(int campaignId, ActivityDetailModel activity, IFormFile fileUpload)
        {
            if (activity.EndDateTime < activity.StartDateTime)
            {
                ModelState.AddModelError(nameof(activity.EndDateTime), "End date cannot be earlier than the start date");
            }

            CampaignSummaryModel campaign = _mediator.Send(new CampaignSummaryQuery {
                CampaignId = campaignId
            });

            if (campaign == null ||
                !User.IsOrganizationAdmin(campaign.OrganizationId))
            {
                return(HttpUnauthorized());
            }

            if (activity.StartDateTime < campaign.StartDate)
            {
                ModelState.AddModelError(nameof(activity.StartDateTime), "Start date cannot be earlier than the campaign start date " + campaign.StartDate.ToString("d"));
            }

            if (activity.EndDateTime > campaign.EndDate)
            {
                ModelState.AddModelError(nameof(activity.EndDateTime), "End date cannot be later than the campaign end date " + campaign.EndDate.ToString("d"));
            }

            if (ModelState.IsValid)
            {
                if (fileUpload != null)
                {
                    if (!fileUpload.IsAcceptableImageContentType())
                    {
                        ModelState.AddModelError("ImageUrl", "You must upload a valid image file for the logo (.jpg, .png, .gif)");
                        return(View("Edit", activity));
                    }
                }

                activity.OrganizationId = campaign.OrganizationId;
                var id = _mediator.Send(new EditActivityCommand {
                    Activity = activity
                });

                if (fileUpload != null)
                {
                    // resave now that activity has the ImageUrl
                    activity.Id       = id;
                    activity.ImageUrl = await _imageService.UploadActivityImageAsync(campaign.OrganizationId, id, fileUpload);

                    _mediator.Send(new EditActivityCommand {
                        Activity = activity
                    });
                }

                return(RedirectToAction("Details", "Activity", new { area = "Admin", id = id }));
            }
            return(View("Edit", activity));
        }
Ejemplo n.º 4
0
        public async Task CreateReturnsEditView_When_ModelStateNotValid()
        {
            var sut = GetActivityController();

            sut.ModelState.AddModelError("test", "test");
            var activityModel = new ActivityDetailModel();
            var result        = (ViewResult)await sut.Create(1, activityModel, null);

            Assert.Equal("Edit", result.ViewName);
        }
Ejemplo n.º 5
0
        public async Task <IActionResult> Edit(ActivityDetailModel activity, IFormFile fileUpload)
        {
            if (activity == null)
            {
                return(HttpBadRequest());
            }
            //TODO: Use the query pattern here
            int organizationId = _dataAccess.GetManagingOrganizationId(activity.Id);

            if (!User.IsOrganizationAdmin(organizationId))
            {
                return(HttpUnauthorized());
            }

            if (activity.EndDateTime < activity.StartDateTime)
            {
                ModelState.AddModelError(nameof(activity.EndDateTime), "End date cannot be earlier than the start date");
            }

            CampaignSummaryModel campaign = _mediator.Send(new CampaignSummaryQuery {
                CampaignId = activity.CampaignId
            });

            if (activity.StartDateTime < campaign.StartDate)
            {
                ModelState.AddModelError(nameof(activity.StartDateTime), "Start date cannot be earlier than the campaign start date " + campaign.StartDate.ToString("d"));
            }

            if (activity.EndDateTime > campaign.EndDate)
            {
                ModelState.AddModelError(nameof(activity.EndDateTime), "End date cannot be later than the campaign end date " + campaign.EndDate.ToString("d"));
            }

            if (ModelState.IsValid)
            {
                if (fileUpload != null)
                {
                    if (fileUpload.IsAcceptableImageContentType())
                    {
                        activity.ImageUrl = await _imageService.UploadActivityImageAsync(campaign.OrganizationId, activity.Id, fileUpload);
                    }
                    else
                    {
                        ModelState.AddModelError("ImageUrl", "You must upload a valid image file for the logo (.jpg, .png, .gif)");
                        return(View(activity));
                    }
                }

                var id = _mediator.Send(new EditActivityCommand {
                    Activity = activity
                });
                return(RedirectToAction("Details", "Activity", new { area = "Admin", id = id }));
            }
            return(View(activity));
        }
Ejemplo n.º 6
0
        public async Task <IActionResult> Create(int campaignId, ActivityDetailModel activity, IFormFile fileUpload)
        {
            CampaignSummaryModel campaign = await _mediator.SendAsync(new CampaignSummaryQuery { CampaignId = campaignId });

            if (campaign == null ||
                !User.IsOrganizationAdmin(campaign.OrganizationId))
            {
                return(HttpUnauthorized());
            }

            var validator = new ActivityDetailModelValidator(_mediator);
            var errors    = await validator.Validate(activity, campaign);

            errors.ToList().ForEach(e => ModelState.AddModelError(e.Key, e.Value));

            //TryValidateModel is called explictly because of MVC 6 behavior that supresses model state validation during model binding when binding to an IFormFile.
            //See #619.
            if (ModelState.IsValid && TryValidateModel(activity))
            {
                if (fileUpload != null)
                {
                    if (!fileUpload.IsAcceptableImageContentType())
                    {
                        ModelState.AddModelError("ImageUrl", "You must upload a valid image file for the logo (.jpg, .png, .gif)");
                        return(View("Edit", activity));
                    }
                }

                activity.OrganizationId = campaign.OrganizationId;
                var id = _mediator.Send(new EditActivityCommand {
                    Activity = activity
                });

                if (fileUpload != null)
                {
                    // resave now that activity has the ImageUrl
                    activity.Id       = id;
                    activity.ImageUrl = await _imageService.UploadActivityImageAsync(campaign.OrganizationId, id, fileUpload);

                    _mediator.Send(new EditActivityCommand {
                        Activity = activity
                    });
                }

                return(RedirectToAction("Details", "Activity", new { area = "Admin", id = id }));
            }

            return(View("Edit", activity));
        }
Ejemplo n.º 7
0
        public async Task <IActionResult> Edit(ActivityDetailModel activity, IFormFile fileUpload)
        {
            if (activity == null)
            {
                return(HttpBadRequest());
            }

            var organizationId = _mediator.Send(new ManagingOrganizationIdByActivityIdQuery {
                ActivityId = activity.Id
            });

            if (!User.IsOrganizationAdmin(organizationId))
            {
                return(HttpUnauthorized());
            }

            var campaign = await _mediator.SendAsync(new CampaignSummaryQuery { CampaignId = activity.CampaignId });

            var validator = new ActivityDetailModelValidator(_mediator);
            var errors    = await validator.Validate(activity, campaign);

            errors.ForEach(e => ModelState.AddModelError(e.Key, e.Value));

            if (ModelState.IsValid)
            {
                if (fileUpload != null)
                {
                    if (fileUpload.IsAcceptableImageContentType())
                    {
                        activity.ImageUrl = await _imageService.UploadActivityImageAsync(campaign.OrganizationId, activity.Id, fileUpload);
                    }
                    else
                    {
                        ModelState.AddModelError("ImageUrl", "You must upload a valid image file for the logo (.jpg, .png, .gif)");
                        return(View(activity));
                    }
                }

                var id = await _mediator.SendAsync(new EditActivityCommand { Activity = activity });

                return(RedirectToAction(nameof(Details), new { area = "Admin", id = id }));
            }

            return(View(activity));
        }
Ejemplo n.º 8
0
        // GET: Activity/Edit/5
        public IActionResult Edit(int id)
        {
            ActivityDetailModel activity = _mediator.Send(new ActivityDetailQuery {
                ActivityId = id
            });

            if (activity == null)
            {
                return(HttpNotFound());
            }

            if (!User.IsOrganizationAdmin(activity.OrganizationId))
            {
                return(HttpUnauthorized());
            }

            return(View(activity));
        }
Ejemplo n.º 9
0
        public static Activity MapToEntity(ActivityDetailModel activityDetailModel)
        {
            if (activityDetailModel.GetType() == typeof(CommentDetailModel))
            {
                return(CommentMapper.MapToEntity((CommentDetailModel)activityDetailModel));
            }

            if (activityDetailModel.GetType() == typeof(PostListModel))
            {
                return(PostMapper.MapListModelToEntity((PostListModel)activityDetailModel));
            }
            if (activityDetailModel.GetType() == typeof(PostDetailModel))
            {
                return(PostMapper.MapDetailModelToEntity((PostDetailModel)activityDetailModel));
            }

            throw new Exception("Invalid activity model to map!");
        }
Ejemplo n.º 10
0
        public async Task ReportErrorsWhenEndDateIsInvalid()
        {
            // arrage
            var mediator  = new Mock <IMediator>();
            var validator = new ActivityDetailModelValidator(mediator.Object);
            var campaign  = new CampaignSummaryModel();
            var model     = new ActivityDetailModel
            {
                StartDateTime = new DateTimeOffset(new DateTime(2000, 1, 1)),
                EndDateTime   = new DateTimeOffset(new DateTime(1999, 1, 1))
            };

            // act
            var errors = await validator.Validate(model, campaign);

            // assert
            Assert.True(errors.Exists(x => x.Key.Equals("EndDateTime")));
        }
Ejemplo n.º 11
0
        public void ActivityDoesNotExist()
        {
            var context = ServiceProvider.GetService <AllReadyContext>();

            var htb = new Organization
            {
                Id        = 123,
                Name      = "Humanitarian Toolbox",
                LogoUrl   = "http://www.htbox.org/upload/home/ht-hero.png",
                WebUrl    = "http://www.htbox.org",
                Campaigns = new List <Campaign>()
            };

            var firePrev = new Campaign
            {
                Id   = 1,
                Name = "Neighborhood Fire Prevention Days",
                ManagingOrganization = htb,
                TimeZoneId           = "Central Standard Time"
            };

            htb.Campaigns.Add(firePrev);

            context.Organizations.Add(htb);
            context.SaveChanges();

            var vm = new ActivityDetailModel
            {
                CampaignId = 1,
                TimeZoneId = "Central Standard Time"
            };

            var query = new EditActivityCommand {
                Activity = vm
            };
            var handler = new EditActivityCommandHandler(context);
            var result  = handler.Handle(query);

            Assert.True(result > 0);

            var data = context.Activities.Count(_ => _.Id == result);

            Assert.True(data == 1);
        }
Ejemplo n.º 12
0
        public async Task CreateReturnsEditView_When_ActivityEndDateAfterCampaignEndDate()
        {
            var campaignStartDate = new DateTimeOffset(new DateTime(1900, 1, 1));
            var campaignEndDate   = campaignStartDate.AddDays(4);
            var sut           = GetActivityController(campaignStartDate, campaignEndDate);
            var activityModel = new ActivityDetailModel
            {
                EndDateTime   = campaignEndDate.AddDays(1),
                StartDateTime = campaignStartDate
            };

            var result = (ViewResult)await sut.Create(1, activityModel, null);

            Assert.Equal("Edit", result.ViewName);
            var errors = sut.ModelState.GetErrorMessages();

            Assert.Equal(1, errors.Count);
            Assert.Equal("End date cannot be later than the campaign end date " + campaignEndDate.ToString("d"), errors[0]);
        }
Ejemplo n.º 13
0
        public async Task <ActivityDetailModel> GetAcvitityDetail(string mcs_activityid)
        {
            try
            {
                ActivityDetailModel model = new ActivityDetailModel();

                var userInfo    = ContextContainer.GetValue <UserInfo>(ContextExtensionTypes.CurrentUserInfo);
                var ProxyUserId = userInfo != null ? userInfo.systemuserid : null;

                var dicHead = new Dictionary <string, IEnumerable <string> >();
                dicHead.Add("Prefer", new List <string>()
                {
                    "odata.include-annotations=\"*\""
                });


                #region 培育任务基本信息
                var activityData = await _crmService.Retrieve("mcs_activity", Guid.Parse(mcs_activityid), string.Empty, ProxyUserId, dicHead);

                model.ActivityInfo = activityData;

                #endregion

                #region 唯一线索基本信息

                if (activityData.Attributes.ContainsKey("_mcs_onlyleadid_value") && !string.IsNullOrEmpty(activityData.Attributes["_mcs_onlyleadid_value"].ToString()))
                {
                    var onlyleadid   = activityData.Attributes["_mcs_onlyleadid_value"].ToString();
                    var onlyleadData = await _crmService.Retrieve("mcs_onlylead", Guid.Parse(onlyleadid), string.Empty, ProxyUserId, dicHead);

                    model.OnlyLeadInfo = onlyleadData;
                }

                #endregion

                return(model);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
Ejemplo n.º 14
0
        public IActionResult DeleteConfirmed(System.Int32 id)
        {
            //TODO: Should be using an ActivitySummaryQuery here
            ActivityDetailModel activity = _mediator.Send(new ActivityDetailQuery {
                ActivityId = id
            });

            if (activity == null)
            {
                return(HttpNotFound());
            }
            if (!User.IsOrganizationAdmin(activity.OrganizationId))
            {
                return(HttpUnauthorized());
            }
            _mediator.Send(new DeleteActivityCommand {
                ActivityId = id
            });
            return(RedirectToAction("Details", "Campaign", new { area = "Admin", id = activity.CampaignId }));
        }
Ejemplo n.º 15
0
        public async Task ReportErrorsWhenPostalCodeInvalid()
        {
            // arrage
            var mediator  = new Mock <IMediator>();
            var validator = new ActivityDetailModelValidator(mediator.Object);
            var campaign  = new CampaignSummaryModel();
            var model     = new ActivityDetailModel
            {
                Location = new LocationEditModel()
                {
                    PostalCode = "12345",
                    State      = "WA",
                    City       = "Seattle"
                }
            };

            // act
            var errors = await validator.Validate(model, campaign);

            // assert
            Assert.True(errors.Exists(x => x.Key.Equals("PostalCode")));
        }
        public async Task<List<KeyValuePair<string, string>>> Validate(ActivityDetailModel model, CampaignSummaryModel parentCampaign)
        {
            var result = new List<KeyValuePair<string, string>>();

            if (model.EndDateTime < model.StartDateTime)
            {
                result.Add(new KeyValuePair<string, string>(nameof(model.EndDateTime), "End date cannot be earlier than the start date"));
            }

            if (model.StartDateTime < parentCampaign.StartDate)
            {
                result.Add(new KeyValuePair<string, string>(nameof(model.StartDateTime), "Start date cannot be earlier than the campaign start date " + parentCampaign.StartDate.ToString("d")));
            }

            if (model.EndDateTime > parentCampaign.EndDate)
            {
                result.Add(new KeyValuePair<string, string>(nameof(model.EndDateTime), "End date cannot be later than the campaign end date " + parentCampaign.EndDate.ToString("d")));
            }

            var postalCodeValidation = new LocationEditModelValidator(_mediator);
            var postalCodeErrors = await postalCodeValidation.Validate(model.Location);
            postalCodeErrors.ToList().ForEach(e => result.Add(new KeyValuePair<string, string>(e.Key, e.Value)));
            return result;
        }
Ejemplo n.º 17
0
        public void ExistingActivityUpdateLocation()
        {
            PostalCodeGeo seattlePostalCode = new PostalCodeGeo()
            {
                City = "Seattle", PostalCode = "98117", State = "WA"
            };
            Location seattle = new Location()
            {
                Id          = 1,
                Address1    = "123 Main Street",
                Address2    = "Unit 2",
                City        = "Seattle",
                PostalCode  = seattlePostalCode,
                Country     = "USA",
                State       = "WA",
                Name        = "Organizer name",
                PhoneNumber = "555-555-5555"
            };

            var          context = ServiceProvider.GetService <AllReadyContext>();
            Organization htb     = new Organization()
            {
                Id        = 123,
                Name      = "Humanitarian Toolbox",
                LogoUrl   = "http://www.htbox.org/upload/home/ht-hero.png",
                WebUrl    = "http://www.htbox.org",
                Campaigns = new List <Campaign>()
            };
            Campaign firePrev = new Campaign()
            {
                Id   = 1,
                Name = "Neighborhood Fire Prevention Days",
                ManagingOrganization = htb,
                TimeZoneId           = "Central Standard Time"
            };

            htb.Campaigns.Add(firePrev);
            Activity queenAnne = new Activity()
            {
                Id             = 100,
                Name           = "Queen Anne Fire Prevention Day",
                Campaign       = firePrev,
                CampaignId     = firePrev.Id,
                StartDateTime  = new DateTime(2015, 7, 4, 10, 0, 0).ToUniversalTime(),
                EndDateTime    = new DateTime(2015, 12, 31, 15, 0, 0).ToUniversalTime(),
                Location       = seattle,
                RequiredSkills = new List <ActivitySkill>()
            };

            context.Locations.Add(seattle);
            context.Organizations.Add(htb);
            context.Activities.Add(queenAnne);
            context.SaveChanges();

            var NEW_LOCATION = LocationExtensions.ToEditModel(new Location()
            {
                Address1   = "123 new address",
                Address2   = "new suite",
                PostalCode = new PostalCodeGeo()
                {
                    City = "Bellevue", PostalCode = "98004", State = "WA"
                },
                City        = "Bellevue",
                State       = "WA",
                Country     = "USA",
                Name        = "New name",
                PhoneNumber = "New number"
            });

            var locationEdit = new ActivityDetailModel
            {
                CampaignId       = queenAnne.CampaignId,
                CampaignName     = queenAnne.Campaign.Name,
                Description      = queenAnne.Description,
                EndDateTime      = queenAnne.EndDateTime,
                Id               = queenAnne.Id,
                ImageUrl         = queenAnne.ImageUrl,
                Location         = NEW_LOCATION,
                Name             = queenAnne.Name,
                RequiredSkills   = queenAnne.RequiredSkills,
                TimeZoneId       = "Central Standard Time",
                StartDateTime    = queenAnne.StartDateTime,
                Tasks            = null,
                OrganizationId   = queenAnne.Campaign.ManagingOrganizationId,
                OrganizationName = queenAnne.Campaign.ManagingOrganization.Name,
                Volunteers       = null
            };

            var query = new EditActivityCommand {
                Activity = locationEdit
            };
            var handler = new EditActivityCommandHandler(context);
            var result  = handler.Handle(query);

            Assert.Equal(100, result); // should get back the activity id

            var data = context.Activities.Single(a => a.Id == result);

            Assert.Equal(data.Location.Address1, NEW_LOCATION.Address1);
            Assert.Equal(data.Location.Address2, NEW_LOCATION.Address2);
            Assert.Equal(data.Location.City, NEW_LOCATION.City);
            Assert.Equal(data.Location.PostalCode?.PostalCode, NEW_LOCATION.PostalCode);
            Assert.Equal(data.Location.State, NEW_LOCATION.State);
            Assert.Equal(data.Location.Country, NEW_LOCATION.Country);
            Assert.Equal(data.Location.PhoneNumber, NEW_LOCATION.PhoneNumber);
            Assert.Equal(data.Location.Name, NEW_LOCATION.Name);
        }
Ejemplo n.º 18
0
        public void ExistingActivity()
        {
            var context = ServiceProvider.GetService <AllReadyContext>();

            var htb = new Organization
            {
                Id        = 123,
                Name      = "Humanitarian Toolbox",
                LogoUrl   = "http://www.htbox.org/upload/home/ht-hero.png",
                WebUrl    = "http://www.htbox.org",
                Campaigns = new List <Campaign>()
            };

            var firePrev = new Campaign
            {
                Id   = 1,
                Name = "Neighborhood Fire Prevention Days",
                ManagingOrganization = htb,
                TimeZoneId           = "Central Standard Time"
            };

            htb.Campaigns.Add(firePrev);

            var queenAnne = new Activity
            {
                Id            = 100,
                Name          = "Queen Anne Fire Prevention Day",
                Campaign      = firePrev,
                CampaignId    = firePrev.Id,
                StartDateTime = new DateTime(2015, 7, 4, 10, 0, 0).ToUniversalTime(),
                EndDateTime   = new DateTime(2015, 12, 31, 15, 0, 0).ToUniversalTime(),
                Location      = new Location {
                    Id = 1
                },
                RequiredSkills = new List <ActivitySkill>()
            };

            context.Organizations.Add(htb);
            context.Activities.Add(queenAnne);
            context.SaveChanges();

            const string NEW_NAME = "Some new name value";

            var startDateTime = new DateTime(2015, 7, 12, 4, 15, 0);
            var endDateTime   = new DateTime(2015, 12, 7, 15, 10, 0);
            var vm            = new ActivityDetailModel
            {
                CampaignId       = queenAnne.CampaignId,
                CampaignName     = queenAnne.Campaign.Name,
                Description      = queenAnne.Description,
                EndDateTime      = endDateTime,
                Id               = queenAnne.Id,
                ImageUrl         = queenAnne.ImageUrl,
                Location         = null,
                Name             = NEW_NAME,
                RequiredSkills   = queenAnne.RequiredSkills,
                TimeZoneId       = "Central Standard Time",
                StartDateTime    = startDateTime,
                Tasks            = null,
                OrganizationId   = queenAnne.Campaign.ManagingOrganizationId,
                OrganizationName = queenAnne.Campaign.ManagingOrganization.Name,
                Volunteers       = null
            };
            var query = new EditActivityCommand {
                Activity = vm
            };
            var handler = new EditActivityCommandHandler(context);
            var result  = handler.Handle(query);

            Assert.Equal(100, result); // should get back the activity id

            var data = context.Activities.Single(_ => _.Id == result);

            Assert.Equal(NEW_NAME, data.Name);

            Assert.Equal(2015, data.StartDateTime.Year);
            Assert.Equal(7, data.StartDateTime.Month);
            Assert.Equal(12, data.StartDateTime.Day);
            Assert.Equal(4, data.StartDateTime.Hour);
            Assert.Equal(15, data.StartDateTime.Minute);
            Assert.Equal(-5, data.StartDateTime.Offset.TotalHours);

            Assert.Equal(2015, data.EndDateTime.Year);
            Assert.Equal(12, data.EndDateTime.Month);
            Assert.Equal(7, data.EndDateTime.Day);
            Assert.Equal(15, data.EndDateTime.Hour);
            Assert.Equal(10, data.EndDateTime.Minute);
            Assert.Equal(-6, data.EndDateTime.Offset.TotalHours);
        }