PageRenderTime 40ms CodeModel.GetById 16ms RepoModel.GetById 1ms app.codeStats 0ms

/CmsData/APIOrganization.cs

https://bitbucket.org/rbhakser/bvcms
C# | 528 lines | 507 code | 20 blank | 1 comment | 68 complexity | 2f5b9c47e1d4e4c1d24f0efb15b69130 MD5 | raw file
Possible License(s): CC-BY-SA-3.0, Apache-2.0, BSD-3-Clause, AGPL-3.0, MPL-2.0-no-copyleft-exception
  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)
  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. Db.SubmitChanges();
  295. return @"<NewOrganization id=""{0}"" status=""ok""></NewOrganization>".Fmt(o.OrganizationId);
  296. }
  297. catch (Exception ex)
  298. {
  299. return @"<NewOrganization status=""error"">" + ex.Message + "</NewOrganization>";
  300. }
  301. }
  302. public string UpdateOrganization(int orgid, string name, string campusid, string active, string location, string description)
  303. {
  304. try
  305. {
  306. var o = Db.Organizations.Single(oo => oo.OrganizationId == orgid);
  307. if (name.HasValue())
  308. o.OrganizationName = name;
  309. o.CampusId = campusid.ToInt2();
  310. if (active.HasValue())
  311. o.OrganizationStatusId = active.ToBool() ? Codes.OrgStatusCode.Active : Codes.OrgStatusCode.Inactive;
  312. o.Location = location;
  313. o.Description = description;
  314. Db.SubmitChanges();
  315. return "ok";
  316. }
  317. catch (Exception ex)
  318. {
  319. return ex.Message;
  320. }
  321. }
  322. public string AddOrgMember(int OrgId, int PeopleId, string MemberType, bool? pending)
  323. {
  324. try
  325. {
  326. if (!MemberType.HasValue())
  327. MemberType = "Member";
  328. var mt = CmsData.Organization.FetchOrCreateMemberType(Db, MemberType);
  329. OrganizationMember.InsertOrgMembers(Db, OrgId, PeopleId, mt.Id, DateTime.Now, null, pending ?? false);
  330. return @"<AddOrgMember status=""ok"" />";
  331. }
  332. catch (Exception ex)
  333. {
  334. return @"<AddOrgMember status=""error"">" + ex.Message + "</AddOrgMember>";
  335. }
  336. }
  337. public string DropOrgMember(int OrgId, int PeopleId)
  338. {
  339. try
  340. {
  341. var om = Db.OrganizationMembers.SingleOrDefault(mm => mm.OrganizationId == OrgId && mm.PeopleId == PeopleId);
  342. if (om == null)
  343. throw new Exception("no orgmember");
  344. om.Drop(Db, addToHistory: true);
  345. return @"<DropOrgMember status=""ok"" />";
  346. }
  347. catch (Exception ex)
  348. {
  349. return @"<DropOrgMember status=""error"">" + ex.Message + "</DropOrgMember>";
  350. }
  351. }
  352. [Serializable]
  353. public class Member
  354. {
  355. [XmlAttribute]
  356. public int id { get; set; }
  357. public string name { get; set; }
  358. public string type { get; set; }
  359. public string email { get; set; }
  360. }
  361. [Serializable]
  362. public class Organization
  363. {
  364. [XmlAttribute]
  365. public int id { get; set; }
  366. public string name { get; set; }
  367. public string location { get; set; }
  368. public string description { get; set; }
  369. public string extravalue1 { get; set; }
  370. public string extravalue2 { get; set; }
  371. public List<Member> members { get; set; }
  372. }
  373. [Serializable]
  374. public class Organizations
  375. {
  376. [XmlAttribute]
  377. public string status { get; set; }
  378. public List<Organization> List { get; set; }
  379. }
  380. public string ParentOrgs(int id, string extravalue1, string extravalue2)
  381. {
  382. try
  383. {
  384. var q = from o in Db.Organizations
  385. where o.ChildOrgs.Any()
  386. where o.DivisionId == id
  387. select new Organization
  388. {
  389. id = o.OrganizationId,
  390. name = o.OrganizationName,
  391. location = o.Location,
  392. description = o.Description,
  393. extravalue1 = (from ev in o.OrganizationExtras
  394. where ev.Field == extravalue1
  395. select ev.Data).SingleOrDefault(),
  396. extravalue2 = (from ev in o.OrganizationExtras
  397. where ev.Field == extravalue2
  398. select ev.Data).SingleOrDefault(),
  399. members = (from m in o.OrganizationMembers
  400. where m.Pending != true
  401. where m.MemberTypeId != Codes.MemberTypeCode.InActive
  402. where m.MemberType.AttendanceTypeId == Codes.AttendTypeCode.Leader
  403. select new Member
  404. {
  405. id = m.PeopleId,
  406. name = m.Person.Name,
  407. email = m.Person.EmailAddress,
  408. type = m.MemberType.Description
  409. }).ToList()
  410. };
  411. return SerializeOrgs(q, "ParentOrgs", "ParentOrg", "Leaders");
  412. }
  413. catch (Exception ex)
  414. {
  415. return @"<ParentOrgs status=""error"">" + ex.Message + "</ParentOrgs>";
  416. }
  417. }
  418. public string ChildOrgs(int id, string extravalue1, string extravalue2)
  419. {
  420. try
  421. {
  422. var q = from o in Db.Organizations
  423. where o.ParentOrgId == id
  424. select new Organization
  425. {
  426. id = o.OrganizationId,
  427. name = o.OrganizationName,
  428. location = o.Location,
  429. description = o.Description,
  430. extravalue1 = (from ev in o.OrganizationExtras
  431. where ev.Field == extravalue1
  432. select ev.Data).SingleOrDefault(),
  433. extravalue2 = (from ev in o.OrganizationExtras
  434. where ev.Field == extravalue2
  435. select ev.Data).SingleOrDefault(),
  436. members = (from m in o.OrganizationMembers
  437. where m.Pending != true
  438. where m.MemberTypeId != Codes.MemberTypeCode.InActive
  439. select new Member
  440. {
  441. id = m.PeopleId,
  442. name = m.Person.Name,
  443. email = m.Person.EmailAddress,
  444. type = m.MemberType.Description
  445. }).ToList()
  446. };
  447. return SerializeOrgs(q, "ChildOrgs", "ChildOrg", "Members");
  448. }
  449. catch (Exception ex)
  450. {
  451. return @"<ChildOrgs status=""error"">" + ex.Message + "</ChildOrgs>";
  452. }
  453. }
  454. public string ChildOrgMembers(int id)
  455. {
  456. try
  457. {
  458. var q = from o in Db.Organizations
  459. where o.ParentOrgId == id
  460. select new Organization
  461. {
  462. id = o.OrganizationId,
  463. name = o.OrganizationName,
  464. location = o.Location,
  465. description = o.Description,
  466. members = (from m in o.OrganizationMembers
  467. where m.Pending != true
  468. where m.MemberTypeId != Codes.MemberTypeCode.InActive
  469. select new Member
  470. {
  471. id = m.PeopleId,
  472. name = m.Person.Name,
  473. email = m.Person.EmailAddress,
  474. type = m.MemberType.Description
  475. }).ToList()
  476. };
  477. return SerializeOrgs(q, "ChildOrgs", "ChildOrg", "Members");
  478. }
  479. catch (Exception ex)
  480. {
  481. return @"<ChildOrgs status=""error"">" + ex.Message + "</ChildOrgs>";
  482. }
  483. }
  484. private static string SerializeOrgs(IQueryable<Organization> q, string root, string OrgElement, string MembersElement)
  485. {
  486. var sw = new StringWriter();
  487. var a = new Organizations {status = "ok", List = q.ToList()};
  488. var ao = new XmlAttributeOverrides();
  489. ao.Add(typeof (Organizations), new XmlAttributes
  490. {
  491. XmlRoot = new XmlRootAttribute(root)
  492. });
  493. ao.Add(typeof (Organizations), "List", new XmlAttributes
  494. {
  495. XmlElements = {new XmlElementAttribute(OrgElement)}
  496. });
  497. ao.Add(typeof (Organization), "members", new XmlAttributes
  498. {
  499. XmlArray = new XmlArrayAttribute(MembersElement)
  500. });
  501. var xs = new XmlSerializer(typeof (Organizations), ao);
  502. xs.Serialize(sw, a);
  503. return sw.ToString();
  504. }
  505. }
  506. }