Duplicate dependencies when project is duplicated

- fix frappe/erpnext#8274
diff --git a/erpnext/patches.txt b/erpnext/patches.txt
index 522c4fc..2cd3a2c 100644
--- a/erpnext/patches.txt
+++ b/erpnext/patches.txt
@@ -386,4 +386,5 @@
 erpnext.patches.v8_0.update_stock_qty_value_in_purchase_invoice
 erpnext.patches.v8_0.update_supplier_address_in_stock_entry
 erpnext.patches.v8_0.rename_is_sample_item_to_allow_zero_valuation_rate
-erpnext.patches.v8_0.set_null_to_serial_nos_for_disabled_sales_invoices
\ No newline at end of file
+erpnext.patches.v8_0.set_null_to_serial_nos_for_disabled_sales_invoices
+erpnext.patches.v8_0.set_project_copied_from
\ No newline at end of file
diff --git a/erpnext/patches/v8_0/set_project_copied_from.py b/erpnext/patches/v8_0/set_project_copied_from.py
new file mode 100644
index 0000000..be58901
--- /dev/null
+++ b/erpnext/patches/v8_0/set_project_copied_from.py
@@ -0,0 +1,9 @@
+from __future__ import unicode_literals
+import frappe
+
+def execute():
+    frappe.db.sql('''
+        UPDATE `tabProject`
+        SET copied_from=name
+        WHERE copied_from is NULL
+    ''')
\ No newline at end of file
diff --git a/erpnext/projects/doctype/project/project.json b/erpnext/projects/doctype/project/project.json
index e809328..32a3ffd 100644
--- a/erpnext/projects/doctype/project/project.json
+++ b/erpnext/projects/doctype/project/project.json
@@ -1,5 +1,6 @@
 {
  "allow_copy": 0, 
+ "allow_guest_to_view": 0, 
  "allow_import": 1, 
  "allow_rename": 1, 
  "autoname": "field:project_name", 
@@ -556,6 +557,35 @@
   {
    "allow_on_submit": 0, 
    "bold": 0, 
+   "collapsible": 0, 
+   "columns": 0, 
+   "fieldname": "copied_from", 
+   "fieldtype": "Data", 
+   "hidden": 1, 
+   "ignore_user_permissions": 0, 
+   "ignore_xss_filter": 0, 
+   "in_filter": 0, 
+   "in_global_search": 0, 
+   "in_list_view": 0, 
+   "in_standard_filter": 0, 
+   "label": "Copied From", 
+   "length": 0, 
+   "no_copy": 0, 
+   "permlevel": 0, 
+   "precision": "", 
+   "print_hide": 0, 
+   "print_hide_if_no_value": 0, 
+   "read_only": 1, 
+   "remember_last_selected_value": 0, 
+   "report_hide": 0, 
+   "reqd": 0, 
+   "search_index": 0, 
+   "set_only_once": 0, 
+   "unique": 0
+  }, 
+  {
+   "allow_on_submit": 0, 
+   "bold": 0, 
    "collapsible": 1, 
    "columns": 0, 
    "fieldname": "section_break0", 
@@ -1052,7 +1082,7 @@
    "search_index": 0, 
    "set_only_once": 0, 
    "unique": 0
-  },   
+  }, 
   {
    "allow_on_submit": 0, 
    "bold": 0, 
@@ -1174,19 +1204,19 @@
    "unique": 0
   }
  ], 
+ "has_web_view": 0, 
  "hide_heading": 0, 
  "hide_toolbar": 0, 
  "icon": "fa fa-puzzle-piece", 
  "idx": 29, 
  "image_view": 0, 
  "in_create": 0, 
- "in_dialog": 0, 
  "is_submittable": 0, 
  "issingle": 0, 
  "istable": 0, 
  "max_attachments": 4, 
- "modified": "2017-02-17 17:24:04.146872", 
- "modified_by": "Administrator", 
+ "modified": "2017-04-19 13:16:32.462005", 
+ "modified_by": "faris@erpnext.com", 
  "module": "Projects", 
  "name": "Project", 
  "owner": "Administrator", 
@@ -1261,4 +1291,4 @@
  "timeline_field": "customer", 
  "track_changes": 0, 
  "track_seen": 1
-}
+}
\ No newline at end of file
diff --git a/erpnext/projects/doctype/project/project.py b/erpnext/projects/doctype/project/project.py
index 37734f1..40493e1 100644
--- a/erpnext/projects/doctype/project/project.py
+++ b/erpnext/projects/doctype/project/project.py
@@ -205,6 +205,32 @@
 	def on_update(self):
 		self.load_tasks()
 		self.sync_tasks()
+		self.update_dependencies_on_duplicated_project()
+	
+	def update_dependencies_on_duplicated_project(self):
+		if self.flags.dont_sync_tasks: return
+		if not self.copied_from:
+			self.copied_from = self.name
+
+		if self.name != self.copied_from and self.get('__unsaved'):
+			# duplicated project
+			dependency_map = {}
+			for task in self.tasks:
+				name, depends_on_tasks = frappe.db.get_value(
+					'Task', { "subject": task.title, "project": self.copied_from }, ['name', 'depends_on_tasks']
+				)
+				depends_on_tasks = [x for x in depends_on_tasks.split(',') if x]
+				dependency_map[task.title] = [ x['subject'] for x in frappe.get_list(
+					'Task Depends On', {"parent": name}, ['subject'])]
+
+			for key, value in dependency_map.iteritems():
+				task_name = frappe.db.get_value('Task', {"subject": key, "project": self.name })
+				task_doc = frappe.get_doc('Task', task_name)
+
+				for dt in value:
+					dt_name = frappe.db.get_value('Task', {"subject": dt, "project": self.name })
+					task_doc.append('depends_on', {"task": dt_name})
+				task_doc.save()
 
 def get_timeline_data(doctype, name):
 	'''Return timeline for attendance'''
diff --git a/erpnext/projects/doctype/task/task.py b/erpnext/projects/doctype/task/task.py
index 44c81a6..43240b2 100644
--- a/erpnext/projects/doctype/task/task.py
+++ b/erpnext/projects/doctype/task/task.py
@@ -53,9 +53,9 @@
 			frappe.throw(_("Progress % for a task cannot be more than 100."))
 
 	def update_depends_on(self):
-		depends_on_tasks = ""
+		depends_on_tasks = self.depends_on_tasks or ""
 		for d in self.depends_on:
-			if d.task:
+			if d.task and not d.task in depends_on_tasks:
 				depends_on_tasks += d.task + ","
 		self.depends_on_tasks = depends_on_tasks