PageRenderTime 67ms CodeModel.GetById 36ms RepoModel.GetById 0ms app.codeStats 0ms

/CmsData/APIOrganization.cs

https://bitbucket.org/mahalowe/bvcms
C# | 529 lines | 508 code | 20 blank | 1 comment | 68 complexity | 628ef02f7d65933b06ac3f437be53af1 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, Apache-2.0, BSD-3-Clause, LGPL-2.1, MPL-2.0-no-copyleft-exception, AGPL-3.0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Xml;
  5. using System.Text;
  6. using System.Linq;
  7. using System.Xml.Serialization;
  8. using UtilityExtensions;
  9. using IronPython.Hosting;
  10. using System.Data.Linq;
  11. namespace CmsData.API
  12. {
  13. public class APIOrganization
  14. {
  15. private CMSDataContext Db;
  16. public APIOrganization()
  17. {
  18. Db = new CMSDataContext("Data Source=.;Initial Catalog=CMS_bellevue;Integrated Security=True");
  19. }
  20. public APIOrganization(CMSDataContext Db)
  21. {
  22. this.Db = Db;
  23. }
  24. public string OrganizationsForDiv(int divid)
  25. {
  26. var q = from o in Db.Organizations
  27. where o.DivOrgs.Any(dd => dd.DivId == divid)
  28. where o.OrganizationStatusId == CmsData.Codes.OrgStatusCode.Active
  29. let leader = Db.People.SingleOrDefault(ll => ll.PeopleId == o.LeaderId)
  30. select new
  31. {
  32. o.OrganizationId,
  33. o.OrganizationName,
  34. o.Location,
  35. o.Description,
  36. o.CampusId,
  37. o.LeaderName,
  38. o.LeaderId,
  39. Email = leader != null ? leader.EmailAddress : "",
  40. IsParent = o.ChildOrgs.Count() > 0,
  41. NumMembers = o.OrganizationMembers.Count(om => om.Pending != true && om.MemberTypeId != CmsData.Codes.MemberTypeCode.InActive)
  42. };
  43. var w = new APIWriter();
  44. w.Start("Organizations");
  45. foreach (var o in q)
  46. {
  47. w.Start("Organization");
  48. w.Attr("Id", o.OrganizationId);
  49. w.Attr("Name", o.OrganizationName);
  50. w.Attr("NumMembers", o.NumMembers);
  51. if (o.IsParent)
  52. w.Attr("IsParent", o.IsParent);
  53. w.Attr("Location", o.Location);
  54. w.Attr("Description", o.Description);
  55. w.Attr("CampusId", o.CampusId);
  56. w.Attr("Leader", o.LeaderName);
  57. w.Attr("LeaderId", o.LeaderId);
  58. w.Attr("Email", o.Email);
  59. w.End();
  60. }
  61. w.End();
  62. return w.ToString();
  63. }
  64. public class OrgMemberInfo
  65. {
  66. public OrganizationMember member { get; set; }
  67. public Person person { get; set; }
  68. public IEnumerable<string> tags { get; set; }
  69. }
  70. public List<OrgMemberInfo> OrgMembersData(int orgid)
  71. {
  72. // load data, do in memory joins
  73. var qm = (from m in Db.OrganizationMembers
  74. where m.OrganizationId == orgid
  75. where m.MemberTypeId != Codes.MemberTypeCode.InActive
  76. select new { m, m.Person }).ToList();
  77. var mt = (from m in Db.OrgMemMemTags
  78. where m.OrganizationMember.OrganizationId == orgid
  79. where m.OrganizationMember.MemberTypeId != Codes.MemberTypeCode.InActive
  80. select new { m.OrganizationMember.PeopleId, m.MemberTag.Name }).ToList();
  81. var q = from i in qm
  82. select new OrgMemberInfo
  83. {
  84. member = i.m,
  85. person = i.Person,
  86. tags = from t in mt
  87. where t.PeopleId == i.m.PeopleId
  88. select t.Name,
  89. };
  90. return q.ToList();
  91. }
  92. public string OrgMembersPython(int orgid)
  93. {
  94. var list = OrgMembersData(orgid);
  95. var script = Db.Content("API-OrgMembers");
  96. if (script == null)
  97. {
  98. script = new Content();
  99. script.Body = @"
  100. from System import *
  101. from System.Text import *
  102. class OrgMembers(object):
  103. def Run(self, m, w, q):
  104. w.Start('OrgMembers')
  105. for i in q:
  106. w.Start('Member')
  107. w.Attr('PeopleId', i.member.PeopleId)
  108. w.Attr('Name', i.member.Person.Name)
  109. w.Attr('PreferredName', i.member.Person.PreferredName)
  110. w.Attr('LastName', i.member.Person.LastName)
  111. w.Attr('Email', i.member.Person.EmailAddress)
  112. w.Attr('Enrolled', i.member.EnrollmentDate)
  113. w.Attr('MemberType', i.member.MemberType.Description)
  114. for t in i.tags:
  115. w.Add('Group', t)
  116. w.End()
  117. w.End()
  118. return w.ToString()
  119. ";
  120. }
  121. if (script == null)
  122. return "<login error=\"no API-OrgMembers script\" />";
  123. var engine = Python.CreateEngine();
  124. var sc = engine.CreateScriptSourceFromString(script.Body);
  125. try
  126. {
  127. var code = sc.Compile();
  128. var scope = engine.CreateScope();
  129. code.Execute(scope);
  130. dynamic LoginInfo = scope.GetVariable("OrgMembers");
  131. dynamic m = LoginInfo();
  132. var w = new APIWriter();
  133. return m.Run(this, w, list);
  134. }
  135. catch (Exception ex)
  136. {
  137. return "<login error=\"API-OrgMembers script error: {0}\" />".Fmt(ex.Message);
  138. }
  139. }
  140. public string OrgMembers(int orgid, string search)
  141. {
  142. search = search ?? "";
  143. var nosearch = !search.HasValue();
  144. var qm = from m in Db.OrganizationMembers
  145. where m.OrganizationId == orgid
  146. where nosearch || m.Person.Name2.StartsWith(search)
  147. select new
  148. {
  149. m.PeopleId,
  150. First = m.Person.PreferredName,
  151. Last = m.Person.LastName,
  152. m.Person.EmailAddress,
  153. m.EnrollmentDate,
  154. MemberType = m.MemberType.Description,
  155. IsLeaderType = (m.MemberType.AttendanceTypeId ?? 0) == CmsData.Codes.AttendTypeCode.Leader,
  156. };
  157. var mt = from m in Db.OrgMemMemTags
  158. where m.OrganizationMember.OrganizationId == orgid
  159. where m.OrganizationMember.MemberTypeId != Codes.MemberTypeCode.InActive
  160. select new
  161. {
  162. m.OrganizationMember.PeopleId,
  163. m.MemberTag.Name
  164. };
  165. var mtags = mt.ToList();
  166. var w = new APIWriter();
  167. w.Start("OrgMembers");
  168. foreach (var m in qm.ToList())
  169. {
  170. w.Start("Member");
  171. w.Attr("PreferredName", m.First);
  172. w.Attr("LastName", m.Last);
  173. w.Attr("Email", m.EmailAddress);
  174. w.Attr("Enrolled", m.EnrollmentDate);
  175. w.Attr("MemberType", m.MemberType);
  176. if (m.IsLeaderType)
  177. w.Attr("IsLeader", m.IsLeaderType);
  178. var qt = from t in mtags
  179. where t.PeopleId == m.PeopleId
  180. select t.Name;
  181. foreach (var group in qt)
  182. w.Add("Group", group);
  183. w.End();
  184. }
  185. w.End();
  186. return w.ToString();
  187. }
  188. public string UpdateOrgMember(int orgid, int peopleid, string MemberType, DateTime? EnrollDate, string InactiveDate, bool? pending)
  189. {
  190. try
  191. {
  192. var om = Db.OrganizationMembers.Single(mm =>
  193. mm.OrganizationId == orgid
  194. && mm.PeopleId == peopleid);
  195. if (MemberType.HasValue())
  196. {
  197. var mt = CmsData.Organization.FetchOrCreateMemberType(Db, MemberType);
  198. om.MemberTypeId = mt.Id;
  199. }
  200. if (EnrollDate.HasValue)
  201. om.EnrollmentDate = EnrollDate;
  202. if (pending.HasValue)
  203. om.Pending = pending;
  204. var d = InactiveDate.ToDate();
  205. if (d.HasValue)
  206. om.InactiveDate = d;
  207. else if (InactiveDate == "null")
  208. om.InactiveDate = null;
  209. Db.SubmitChanges();
  210. return "ok";
  211. }
  212. catch (Exception ex)
  213. {
  214. return ex.Message;
  215. }
  216. }
  217. public string DeleteExtraValue(int orgid, string field)
  218. {
  219. try
  220. {
  221. var q = from v in Db.OrganizationExtras
  222. where v.Field == field
  223. where v.OrganizationId == orgid
  224. select v;
  225. Db.OrganizationExtras.DeleteAllOnSubmit(q);
  226. Db.SubmitChanges();
  227. return "ok";
  228. }
  229. catch (Exception ex)
  230. {
  231. return ex.Message;
  232. }
  233. }
  234. public string ExtraValues(int orgid, string fields)
  235. {
  236. try
  237. {
  238. var a = (fields ?? "").Split(',');
  239. var nofields = !fields.HasValue();
  240. var q = from v in Db.OrganizationExtras
  241. where nofields || a.Contains(v.Field)
  242. where v.OrganizationId == orgid
  243. select v;
  244. var w = new APIWriter();
  245. w.Start("ExtraOrgValues");
  246. w.Attr("Id", orgid);
  247. foreach (var v in q)
  248. w.Add(v.Field, v.Data);
  249. w.End();
  250. return w.ToString();
  251. }
  252. catch (Exception ex)
  253. {
  254. return ex.Message;
  255. }
  256. }
  257. public string AddEditExtraValue(int orgid, string field, string value)
  258. {
  259. try
  260. {
  261. var q = from v in Db.OrganizationExtras
  262. where v.Field == field
  263. where v.OrganizationId == orgid
  264. select v;
  265. var ev = q.SingleOrDefault();
  266. if (ev == null)
  267. {
  268. ev = new OrganizationExtra
  269. {
  270. OrganizationId = orgid,
  271. Field = field,
  272. };
  273. Db.OrganizationExtras.InsertOnSubmit(ev);
  274. }
  275. ev.Data = value;
  276. Db.SubmitChanges();
  277. return "ok";
  278. }
  279. catch (Exception ex)
  280. {
  281. return ex.Message;
  282. }
  283. }
  284. public string NewOrganization(int divId, string name, string location, int? parentOrgId, int? campusId)
  285. {
  286. try
  287. {
  288. var d = Db.Divisions.Single(dd => dd.Id == divId);
  289. if (d == null)
  290. throw new Exception("no division " + divId);
  291. var o = CmsData.Organization.CreateOrganization(Db, d, name);
  292. o.ParentOrgId = parentOrgId;
  293. o.Location = location;
  294. o.CampusId = campusId;
  295. Db.SubmitChanges();
  296. return @"<NewOrganization id=""{0}"" status=""ok""></NewOrganization>".Fmt(o.OrganizationId);
  297. }
  298. catch (Exception ex)
  299. {
  300. return @"<NewOrganization status=""error"">" + ex.Message + "</NewOrganization>";
  301. }
  302. }
  303. public string UpdateOrganization(int orgid, string name, string campusid, string active, string location, string description)
  304. {
  305. try
  306. {
  307. var o = Db.Organizations.Single(oo => oo.OrganizationId == orgid);
  308. if (name.HasValue())
  309. o.OrganizationName = name;
  310. o.CampusId = campusid.ToInt2();
  311. if (active.HasValue())
  312. o.OrganizationStatusId = active.ToBool() ? Codes.OrgStatusCode.Active : Codes.OrgStatusCode.Inactive;
  313. o.Location = location;
  314. o.Description = description;
  315. Db.SubmitChanges();
  316. return "ok";
  317. }
  318. catch (Exception ex)
  319. {
  320. return ex.Message;
  321. }
  322. }
  323. public string AddOrgMember(int OrgId, int PeopleId, string MemberType, bool? pending)
  324. {
  325. try
  326. {
  327. if (!MemberType.HasValue())
  328. MemberType = "Member";
  329. var mt = CmsData.Organization.FetchOrCreateMemberType(Db, MemberType);
  330. OrganizationMember.InsertOrgMembers(Db, OrgId, PeopleId, mt.Id, DateTime.Now, null, pending ?? false);
  331. return @"<AddOrgMember status=""ok"" />";
  332. }
  333. catch (Exception ex)
  334. {
  335. return @"<AddOrgMember status=""error"">" + ex.Message + "</AddOrgMember>";
  336. }
  337. }
  338. public string DropOrgMember(int OrgId, int PeopleId)
  339. {
  340. try
  341. {
  342. var om = Db.OrganizationMembers.SingleOrDefault(mm => mm.OrganizationId == OrgId && mm.PeopleId == PeopleId);
  343. if (om == null)
  344. throw new Exception("no orgmember");
  345. om.Drop(Db, addToHistory: true);
  346. return @"<DropOrgMember status=""ok"" />";
  347. }
  348. catch (Exception ex)
  349. {
  350. return @"<DropOrgMember status=""error"">" + ex.Message + "</DropOrgMember>";
  351. }
  352. }
  353. [Serializable]
  354. public class Member
  355. {
  356. [XmlAttribute]
  357. public int id { get; set; }
  358. public string name { get; set; }
  359. public string type { get; set; }
  360. public string email { get; set; }
  361. }
  362. [Serializable]
  363. public class Organization
  364. {
  365. [XmlAttribute]
  366. public int id { get; set; }
  367. public string name { get; set; }
  368. public string location { get; set; }
  369. public string description { get; set; }
  370. public string extravalue1 { get; set; }
  371. public string extravalue2 { get; set; }
  372. public List<Member> members { get; set; }
  373. }
  374. [Serializable]
  375. public class Organizations
  376. {
  377. [XmlAttribute]
  378. public string status { get; set; }
  379. public List<Organization> List { get; set; }
  380. }
  381. public string ParentOrgs(int id, string extravalue1, string extravalue2)
  382. {
  383. try
  384. {
  385. var q = from o in Db.Organizations
  386. where o.ChildOrgs.Any()
  387. where o.DivisionId == id
  388. select new Organization
  389. {
  390. id = o.OrganizationId,
  391. name = o.OrganizationName,
  392. location = o.Location,
  393. description = o.Description,
  394. extravalue1 = (from ev in o.OrganizationExtras
  395. where ev.Field == extravalue1
  396. select ev.Data).SingleOrDefault(),
  397. extravalue2 = (from ev in o.OrganizationExtras
  398. where ev.Field == extravalue2
  399. select ev.Data).SingleOrDefault(),
  400. members = (from m in o.OrganizationMembers
  401. where m.Pending != true
  402. where m.MemberTypeId != Codes.MemberTypeCode.InActive
  403. where m.MemberType.AttendanceTypeId == Codes.AttendTypeCode.Leader
  404. select new Member
  405. {
  406. id = m.PeopleId,
  407. name = m.Person.Name,
  408. email = m.Person.EmailAddress,
  409. type = m.MemberType.Description
  410. }).ToList()
  411. };
  412. return SerializeOrgs(q, "ParentOrgs", "ParentOrg", "Leaders");
  413. }
  414. catch (Exception ex)
  415. {
  416. return @"<ParentOrgs status=""error"">" + ex.Message + "</ParentOrgs>";
  417. }
  418. }
  419. public string ChildOrgs(int id, string extravalue1, string extravalue2)
  420. {
  421. try
  422. {
  423. var q = from o in Db.Organizations
  424. where o.ParentOrgId == id
  425. select new Organization
  426. {
  427. id = o.OrganizationId,
  428. name = o.OrganizationName,
  429. location = o.Location,
  430. description = o.Description,
  431. extravalue1 = (from ev in o.OrganizationExtras
  432. where ev.Field == extravalue1
  433. select ev.Data).SingleOrDefault(),
  434. extravalue2 = (from ev in o.OrganizationExtras
  435. where ev.Field == extravalue2
  436. select ev.Data).SingleOrDefault(),
  437. members = (from m in o.OrganizationMembers
  438. where m.Pending != true
  439. where m.MemberTypeId != Codes.MemberTypeCode.InActive
  440. select new Member
  441. {
  442. id = m.PeopleId,
  443. name = m.Person.Name,
  444. email = m.Person.EmailAddress,
  445. type = m.MemberType.Description
  446. }).ToList()
  447. };
  448. return SerializeOrgs(q, "ChildOrgs", "ChildOrg", "Members");
  449. }
  450. catch (Exception ex)
  451. {
  452. return @"<ChildOrgs status=""error"">" + ex.Message + "</ChildOrgs>";
  453. }
  454. }
  455. public string ChildOrgMembers(int id)
  456. {
  457. try
  458. {
  459. var q = from o in Db.Organizations
  460. where o.ParentOrgId == id
  461. select new Organization
  462. {
  463. id = o.OrganizationId,
  464. name = o.OrganizationName,
  465. location = o.Location,
  466. description = o.Description,
  467. members = (from m in o.OrganizationMembers
  468. where m.Pending != true
  469. where m.MemberTypeId != Codes.MemberTypeCode.InActive
  470. select new Member
  471. {
  472. id = m.PeopleId,
  473. name = m.Person.Name,
  474. email = m.Person.EmailAddress,
  475. type = m.MemberType.Description
  476. }).ToList()
  477. };
  478. return SerializeOrgs(q, "ChildOrgs", "ChildOrg", "Members");
  479. }
  480. catch (Exception ex)
  481. {
  482. return @"<ChildOrgs status=""error"">" + ex.Message + "</ChildOrgs>";
  483. }
  484. }
  485. private static string SerializeOrgs(IQueryable<Organization> q, string root, string OrgElement, string MembersElement)
  486. {
  487. var sw = new StringWriter();
  488. var a = new Organizations {status = "ok", List = q.ToList()};
  489. var ao = new XmlAttributeOverrides();
  490. ao.Add(typeof (Organizations), new XmlAttributes
  491. {
  492. XmlRoot = new XmlRootAttribute(root)
  493. });
  494. ao.Add(typeof (Organizations), "List", new XmlAttributes
  495. {
  496. XmlElements = {new XmlElementAttribute(OrgElement)}
  497. });
  498. ao.Add(typeof (Organization), "members", new XmlAttributes
  499. {
  500. XmlArray = new XmlArrayAttribute(MembersElement)
  501. });
  502. var xs = new XmlSerializer(typeof (Organizations), ao);
  503. xs.Serialize(sw, a);
  504. return sw.ToString();
  505. }
  506. }
  507. }