/adspygoogle/adwords/soappy/SanityCheck.py

http://google-api-adwords-python-lib.googlecode.com/ · Python · 264 lines · 159 code · 21 blank · 84 comment · 48 complexity · 4b3fd536dd6aad363100ce66535a6fe7 MD5 · raw file

  1. #!/usr/bin/python
  2. #
  3. # Copyright 2011 Google Inc. All Rights Reserved.
  4. #
  5. # Licensed under the Apache License, Version 2.0 (the "License");
  6. # you may not use this file except in compliance with the License.
  7. # You may obtain a copy of the License at
  8. #
  9. # http://www.apache.org/licenses/LICENSE-2.0
  10. #
  11. # Unless required by applicable law or agreed to in writing, software
  12. # distributed under the License is distributed on an "AS IS" BASIS,
  13. # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  14. # See the License for the specific language governing permissions and
  15. # limitations under the License.
  16. """Validation and type conversion functions."""
  17. __author__ = 'api.sgrinberg@gmail.com (Stan Grinberg)'
  18. from adspygoogle.common import SanityCheck
  19. from adspygoogle.common.soappy import SanityCheck as SoappySanityCheck
  20. def ValidateAccountInfoV13(acct_info):
  21. """Validate AccountInfo object.
  22. Args:
  23. acct_info: dict AccountInfo object with updated values.
  24. """
  25. SanityCheck.ValidateTypes(((acct_info, dict),))
  26. for key in acct_info:
  27. if key == 'defaultNetworkTargeting':
  28. SanityCheck.ValidateTypes(((acct_info[key], list),))
  29. items = []
  30. for sub_key in acct_info[key]:
  31. SanityCheck.ValidateTypes(((sub_key, (str, unicode)),))
  32. items.append('<networkTypes>%s</networkTypes>' % sub_key)
  33. acct_info[key] = SoappySanityCheck.UnType(''.join(items))
  34. elif key == 'emailPromotionsPreferences':
  35. SanityCheck.ValidateTypes(((acct_info[key], dict),))
  36. for sub_key in acct_info[key]:
  37. SanityCheck.ValidateTypes(((acct_info[key][sub_key], (str, unicode)),))
  38. acct_info[key][sub_key] = SoappySanityCheck.UnType(
  39. acct_info[key][sub_key])
  40. else:
  41. SanityCheck.ValidateTypes(((acct_info[key], (str, unicode)),))
  42. def ValidateDefinedReportJobV13(job, name_space):
  43. """Validate DefinedReportJob object.
  44. Args:
  45. job: dict report job object.
  46. name_space: str namespace to use for this ReportJob.
  47. Returns:
  48. instance Untyped instance of the defined report job.
  49. """
  50. items = []
  51. for key in job:
  52. if (key == 'adWordsType' or key == 'crossClient' or key == 'endDay' or
  53. key == 'includeZeroImpression' or key == 'keywordType' or
  54. key == 'name' or key == 'selectedReportType' or key == 'startDay'):
  55. SanityCheck.ValidateTypes(((job[key], (str, unicode)),))
  56. items.append('<%s>%s</%s>' % (key, job[key], key))
  57. else:
  58. SanityCheck.ValidateTypes(((job[key], list),))
  59. for item in job[key]:
  60. SanityCheck.ValidateTypes(((item, (str, unicode)),))
  61. items.append('<%s>%s</%s>' % (key, item, key))
  62. # Explicitly set job's namespace and type.
  63. job = SoappySanityCheck.UnType(''.join(items))
  64. job._setAttr('xmlns:impl', name_space)
  65. job._setAttr('xsi3:type', 'impl:DefinedReportJob')
  66. return job
  67. def ValidateKeywordTrafficRequestV13(request):
  68. """Validate KeywordTrafficRequest object.
  69. Args:
  70. request: dict keyword traffic request.
  71. """
  72. SanityCheck.ValidateTypes(((request, dict),))
  73. for key in request:
  74. SanityCheck.ValidateTypes(((request[key], (str, unicode)),))
  75. request[key] = SoappySanityCheck.UnType(request[key])
  76. def ValidateGeoTargetV13(geo_target):
  77. """Validate GeoTarget object.
  78. Args:
  79. geo_target: dict Geographic targeting rules for this entity.
  80. Returns:
  81. str Geographic targeting converted into str type.
  82. """
  83. SanityCheck.ValidateTypes(((geo_target, dict),))
  84. items = []
  85. for key in geo_target:
  86. if key == 'targetAll':
  87. SanityCheck.ValidateTypes(((geo_target[key], (str, unicode)),))
  88. items.append('<%s>%s</%s>' % (key, geo_target[key], key))
  89. elif key == 'cityTargets':
  90. SanityCheck.ValidateTypes(((geo_target[key], dict),))
  91. items.append('<%s>' % key)
  92. for sub_key in geo_target[key]:
  93. SanityCheck.ValidateTypes(((geo_target[key][sub_key], list),))
  94. for item in geo_target[key][sub_key]:
  95. items.append('<%s>%s</%s>' % (sub_key, item, sub_key))
  96. items.append('</%s>' % key)
  97. elif key == 'countryTargets':
  98. SanityCheck.ValidateTypes(((geo_target[key], dict),))
  99. items.append('<%s>' % key)
  100. for sub_key in geo_target[key]:
  101. SanityCheck.ValidateTypes(((geo_target[key][sub_key], list),))
  102. for item in geo_target[key][sub_key]:
  103. items.append('<%s>%s</%s>' % (sub_key, item, sub_key))
  104. items.append('</%s>' % key)
  105. elif key == 'metroTargets':
  106. SanityCheck.ValidateTypes(((geo_target[key], dict),))
  107. items.append('<%s>' % key)
  108. for sub_key in geo_target[key]:
  109. SanityCheck.ValidateTypes(((geo_target[key][sub_key], list),))
  110. for item in geo_target[key][sub_key]:
  111. items.append('<%s>%s</%s>' % (sub_key, item, sub_key))
  112. items.append('</%s>' % key)
  113. elif key == 'regionTargets':
  114. SanityCheck.ValidateTypes(((geo_target[key], dict),))
  115. items.append('<%s>' % key)
  116. for sub_key in geo_target[key]:
  117. SanityCheck.ValidateTypes(((geo_target[key][sub_key], list),))
  118. for item in geo_target[key][sub_key]:
  119. items.append('<%s>%s</%s>' % (sub_key, item, sub_key))
  120. items.append('</%s>' % key)
  121. elif key == 'proximityTargets':
  122. SanityCheck.ValidateTypes(((geo_target[key], dict),))
  123. items.append('<%s>' % key)
  124. for sub_key in geo_target[key]:
  125. SanityCheck.ValidateTypes(((geo_target[key][sub_key], list),))
  126. for item in geo_target[key][sub_key]:
  127. items.append('<%s>' % sub_key)
  128. SanityCheck.ValidateTypes(((item, dict),))
  129. for sub_sub_key in item:
  130. SanityCheck.ValidateTypes(((item[sub_sub_key], (str, unicode)),))
  131. items.append('<%s>%s</%s>' % (sub_sub_key, item[sub_sub_key],
  132. sub_sub_key))
  133. items.append('</%s>' % sub_key)
  134. items.append('</%s>' % key)
  135. return ''.join(items)
  136. def ValidateLanguageTargetV13(language_target):
  137. """Validate LanguageTarget object.
  138. Args:
  139. language_target: list Languages targeted by this entity.
  140. Returns:
  141. str Languages targeted converted into str type.
  142. """
  143. SanityCheck.ValidateTypes(((language_target, list),))
  144. items = []
  145. for item in language_target:
  146. SanityCheck.ValidateTypes(((item, (str, unicode)),))
  147. items.append('<languages>%s</languages>' % item)
  148. return ''.join(items)
  149. def ValidateNetworkTargetV13(network_target):
  150. """Validate NetworkTarget object.
  151. Args:
  152. network_target: list Advertising networks targeted by this entity.
  153. Returns:
  154. str Adertising networks converted into str type.
  155. """
  156. SanityCheck.ValidateTypes(((network_target, list),))
  157. items = []
  158. for item in network_target:
  159. SanityCheck.ValidateTypes(((item, (str, unicode)),))
  160. items.append('<networkTypes>%s</networkTypes>' % item)
  161. return ''.join(items)
  162. def ValidateCampaignRequestV13(request):
  163. """Validate CampaignRequest object.
  164. Args:
  165. request: dict Campaign request.
  166. Returns:
  167. str Campaign request converted into str type.
  168. """
  169. SanityCheck.ValidateTypes(((request, dict),))
  170. items = []
  171. for key in request:
  172. if key == 'adGroupRequests':
  173. SanityCheck.ValidateTypes(((request[key], list),))
  174. items.append('<adGroupRequests>')
  175. for item in request[key]:
  176. items.append(ValidateAdGroupRequestV13(item))
  177. items.append('</adGroupRequests>')
  178. elif key == 'geoTargeting':
  179. SanityCheck.ValidateTypes(((request[key], dict),))
  180. items.append(('<geoTargeting>%s</geoTargeting>'
  181. % ValidateGeoTargetV13(request[key])))
  182. elif key == 'id':
  183. SanityCheck.ValidateTypes(((request[key], (str, unicode)),))
  184. items.append('<%s>%s</%s>' % (key, request[key], key))
  185. elif key == 'languageTargeting':
  186. SanityCheck.ValidateTypes(((request[key], list),))
  187. items.append('<%s>%s</%s>' % (key,
  188. ValidateLanguageTargetV13(request[key]),
  189. key))
  190. elif key == 'networkTargeting':
  191. SanityCheck.ValidateTypes(((request[key], list),))
  192. items.append('<%s>%s</%s>' % (key, ValidateNetworkTargetV13(request[key]),
  193. key))
  194. return ''.join(items)
  195. def ValidateAdGroupRequestV13(request):
  196. """Validate AdGroupRequest object.
  197. Args:
  198. request: dict ad group request.
  199. Returns:
  200. str ad group request converted into str type.
  201. """
  202. SanityCheck.ValidateTypes(((request, dict),))
  203. items = []
  204. for key in request:
  205. if key == 'keywordRequests':
  206. items.append('<keywordRequests>')
  207. SanityCheck.ValidateTypes(((request[key], list),))
  208. for item in request[key]:
  209. items.append(ValidateKeywordRequestV13(item))
  210. items.append('</keywordRequests>')
  211. else:
  212. SanityCheck.ValidateTypes(((request[key], (str, unicode)),))
  213. items.append('<%s>%s</%s>' % (key, request[key], key))
  214. return ''.join(items)
  215. def ValidateKeywordRequestV13(request):
  216. """Validate KeywordRequest object.
  217. Args:
  218. request: dict keyword request.
  219. Returns:
  220. str keyword request converted into str type.
  221. """
  222. SanityCheck.ValidateTypes(((request, dict),))
  223. items = []
  224. for key in request:
  225. SanityCheck.ValidateTypes(((request[key], (str, unicode)),))
  226. items.append('<%s>%s</%s>' % (key, request[key], key))
  227. return ''.join(items)